home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / DSHJ2 / RESOURCE.C < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-10  |  104.6 KB  |  4,163 lines

  1. /**************************************************************************/
  2. /*  FILE:  RESOURCE.C        PROGRAM TITLE: DeskSET II Alpha Version   */
  3. /*  Date Created: 12/15/87                          */ 
  4. /*  Last Modified: 01/27/89                          */
  5. /*                                      */
  6. /*  Description: RESOURCE, DIALOG BOXES, ALERT BOXES ROUTINES          */
  7. /*  Routines:   o   open_resource()  - Gaddr Resources and Display Menu   */
  8. /*        o   do_pagenum()     - Handle page icon              */
  9. /*        o   draw_book()         - Draw book icon              */
  10. /*        o   close_resource() - Hides Menu Bar and Frees Resource  */
  11. /*        o   execform()       - Put up a dialog box.               */
  12. /*        o   get_int()         - Ascii ob_spec to int          */
  13. /*        o   set_int()         - Put int to ASCII ob_spec           */
  14. /*        o   get_float()         - ASCII ob_spec to float          */
  15. /*        o   set_float()         - Put float to ASCII ob_spec      */
  16. /*        o   draw_fbox()         - Draw fill box in graphics dialog      */
  17. /*        o   draw_lbox()         - Draw line box in graphics dialog   */
  18. /*        o   do_grdialog()    - Handle graphics attribute dialog   */
  19. /*        o   hndl_box()         - Handle box once object is found    */
  20. /*        o   do_point_size()  - Set Point Size              */
  21. /*        o   do_scoffset()    - Scan offset Dialog Handler      */
  22. /*        o   do_go_page()     - Set Current Page Number...      */
  23. /*        o   do_font_info()   -                     */
  24. /*        o   get_image()         - Setup to load images dialog      */
  25. /*        o   update_point_dialog() Setup font info          */
  26. /*        o   init_artobj()    - Initialize Article Selector box      */
  27. /*        o   deselect()         - Deselect all objects of the article*/
  28. /*        o   init_slider()    - Initialize slider size in box      */
  29. /*        o   get_num_arts()   - Return # of articles in memory      */
  30. /*        o   do_slider()         - Move slider in slider box      */
  31. /*        o   do_artobj()         -                       */
  32. /*        o   hndl_abox()         - Handle the article box          */
  33. /*        o   hndl_list()         - Handle font selection list      */
  34. /*        o   scroll()         -                      */
  35. /*        o   set_artobj()     -                      */
  36. /*        o   do_unit_dialog() - Handle changing units of measure   */
  37. /*         o   do_grid_space()  - Select grid spacing dialog      */
  38. /*        o   do_page_def()    - Page Type Selection Dialog        */
  39. /*        o   do_clip_dialog() - Handle clipping of icons          */
  40. /*        o   do_rcoord()         - Typed coordinates of a region      */
  41. /*        o   do_set_paths()   - Handle Default Path dialog      */
  42. /*        o   set_tedit()         - Insert Text in Text Dialog Field   */
  43. /*        o   get_edit()         - Get Text from Editable Text Field  */
  44. /*        o   do_pcoord()         - Typed coordinates of a primitive   */
  45. /*         o   set_template()   - Handle template usage dialog box   */
  46. /*        o   page_numbering() - Handle page numbering dialog box   */
  47. /*        o   do_dpi()         - Handle user defined dpi ...      */
  48. /**************************************************************************/
  49.  
  50.  
  51. /**************************************************************************/
  52. /* INCLUDE FILES                              */
  53. /**************************************************************************/
  54. #include "define.h"
  55. #include "deskset2.h"
  56. #include "gemdefs.h"
  57. #include <obdefs.h>
  58. #include "osbind.h"
  59. #include "alert.h"
  60. #include "dbase.h"
  61.  
  62.  
  63.  
  64. /**************************************************************************/
  65. /* DEFINES                                  */
  66. /**************************************************************************/
  67.  
  68.                     /* From FTMGR.C              */
  69. #define        SFTSIZ    1548        /* Size of font              */
  70. #define        TFNOFS     15        /* Offset to Typeface name      */
  71. #define     INFOMAX 10        /* info dialog box slots      */
  72.  
  73. #define DINFO struct dinfo
  74.  
  75. struct dinfo
  76. {
  77.    char  txtptr[40];
  78.    DINFO *next;
  79.    DINFO *prev;
  80. };
  81.  
  82.  
  83. /**************************************************************************/
  84. /* EXTERNALS                                  */
  85. /**************************************************************************/
  86. extern int splane;
  87. extern int sxres,syres;                /* screen x and y rez     */
  88. extern int xbook,ybook;                /* book icon position      */
  89.  
  90. extern int shandle;                /* screen handle      */
  91. extern int prev_handle;                 
  92. extern int pageside;                
  93.  
  94. extern int gl_lstyle;                /* graphic attributes     */
  95. extern int gl_lwidth;                /* like..line width      */
  96. extern int gl_fstyle;                /* Fill style          */
  97. extern int gl_findex;                /* fill index          */
  98. extern int gl_repel;                /* graphic repel?      */
  99. extern int gl_repbounds;            
  100. extern int gl_repoffset;
  101.  
  102. extern int scale_set;
  103. extern int view_size;                /* what view scale on scrn*/
  104.  
  105. extern int zdevice;                /* device drawing to...   */
  106. extern int SH;                    /* height of scan...      */
  107. extern unsigned long gl_region_ptr;        /* Text region pointer    */
  108. extern unsigned long gl_grregion_ptr;        /* graphic region pointer */
  109. extern unsigned long region_ptr;        /* region pointer      */
  110.  
  111. extern int curr_page;                /* current page number    */
  112. extern int mode_change;                /* display or not...      */
  113.  
  114. extern int cur_pic_type;            /* current pic type       */
  115. extern int (*funcs)();
  116. extern int nada();
  117. extern char fbuffer[];                /* file name buffer...    */
  118. extern int opwidth,opheight;
  119. extern int graph_flag;
  120. extern int opwidth,opheight;
  121. extern int force_draw_flag;
  122.  
  123. extern    int    gl_hchar;
  124. extern    int    gl_wchar;
  125. extern  int     ptsin[];            /* ptsin array...      */
  126.  
  127. extern  long    getf_article();            /* extern declarations    */
  128. extern  long    getn_article();
  129. extern  char    *get_artfname();
  130.  
  131. extern struct txtattr gltxtattr;        /* global text attributes */
  132. extern int glgrattr[];                /* global graphic attrib  */
  133. extern char pathbuf[];                /* path...          */
  134.  
  135. extern int txt_handle;                /* text window handle     */
  136. extern int prev_handle;                /* preview window handle  */
  137. extern int unit_type;                /* current unit of measure*/
  138.  
  139. extern int dummy;
  140.  
  141. typedef struct dta                /* dta for file i/o      */
  142. {
  143.      char res[21];
  144.      char attr;
  145.      int  time;
  146.      int  date;
  147.      long fsize;
  148.      char str[14];
  149. } DTA;
  150.  
  151. extern DTA thedta;                /* store DTA info here!  */
  152. extern int hgridspace,vgridspace;        /* h and v grid space    */
  153. extern int pagetype;                
  154. extern int pagemux[];
  155. extern int pagemuy[];
  156.  
  157. extern int hpage_size;                /* h and v size in mu's  */
  158. extern int vpage_size;
  159. extern int pxy[];                /* global vertices...    */
  160. extern int cur_scale;
  161.  
  162. extern GRECT dpwork;                /* Actual preview work area*/
  163. extern GRECT pwork;                /* Total preview work area */
  164. extern GRECT page_area;             /* GRECT area Preview area */
  165.  
  166. extern char *gcvt();
  167. extern int article_flag;
  168. extern long bufpath;
  169.  
  170. extern int active_prim;            /* flag if prim is active  */
  171. extern long prim_ptr;            /* ptr to current primitive*/
  172. extern int wmode;
  173. extern long get_curreg();
  174.  
  175. extern int tmplate_flag;
  176. extern int disp_type;            /* display template- BOTH,LEFT,RIGHT*/
  177. extern int disp_pos;            /* display template-FRONT,BACK      */
  178.  
  179. extern PNUMBER pnum;            /* page number structure        */
  180. extern double get_float();
  181.  
  182. extern int axdpi[];            /* array for xdpi            */
  183. extern int aydpi[];            /* array for ydpi            */
  184. extern int half_xdpi[];            /* array for half of x dpi        */
  185. extern int half_ydpi[];            /* array for half of y dpi        */
  186. extern int xdpi[];            /* GO Graphics xdpi array        */
  187. extern int ydpi[];            /* GO Graphics ydpi array        */
  188.  
  189. extern long MALLOC();
  190.  
  191. extern unsigned long scan_bytes;    /* number of bytes in scan buffer   */
  192. extern unsigned long prev_bytes;    /* number of bytes in preview buff  */
  193. extern unsigned long scanptr,scanesc;   /* pointers to scan buffer        */
  194. extern unsigned long page_ptr,pagesc;    /* pointers to preview buffer       */
  195.  
  196. extern int scan_xres;            /* x and y resolution of scan buff  */
  197. extern int scan_yres;
  198.  
  199. extern int sdevm;
  200. extern int mhandle;            /* preview workstation handle     */
  201. extern int intout[];
  202. extern int mxres,myres;            /* current xy res of preview buff */
  203. extern FDB page_MFDB;            /* Preview MFDB area          */
  204. extern unsigned char *get_lmem();
  205. extern long pagebytes;
  206. extern PAGE *curpage;
  207. extern int multi_mode;
  208. extern long first_aregion();
  209. extern long get_regart();
  210. extern long get_lcmem();
  211.  
  212. extern int Pval;    /* parmcheck() result value */
  213.  
  214. extern int ruler_flag;
  215. extern int show_grids;
  216. extern int snap_to_grids;
  217. extern int grid_space;
  218.  
  219. extern int bgmono2[];
  220. extern int bgmed1[];
  221. extern int bgmed2[];
  222.  
  223. extern ARTICLE *arthd;
  224. extern ARTICLE *tarthd;
  225. extern PAGE *pagehd;
  226. extern PAGE *tpagehd;
  227.  
  228. extern int ptsarray[];
  229. extern long get_fregion();
  230. extern long get_nregion();
  231. extern long get_fpage();
  232. extern long get_npage();
  233. extern PAGE *left_tmplate;
  234. extern PAGE *right_tmplate;
  235. extern ARTICLE *rtarthd;
  236. extern ARTICLE *ltarthd;
  237.  
  238. extern DINFO *set_info_graphics();
  239. extern PAGE *clippage;
  240. extern ARTICLE *curart;
  241. extern char *winfo[][4];
  242.  
  243. extern DINFO *get_grfname();
  244.  
  245. /**************************************************************************/
  246. /* GLOBAL VARIABLES                              */
  247. /**************************************************************************/
  248. char rscerr[]  = "[3][ Unable to Locate Resource!][OK]";
  249. char rscerr1[] = "[3][ Preview Functions Disabled.][OK]";
  250. char rscerr2[] = "[1][ Printing Functions Disabled.][OK]";
  251. char rscerr3[] = "[3][ Delete all regions?][OK|CANCEL]";
  252. char linkerr[] = "[3][ This Region is already| linked to an article.][OK]";
  253. char del_page[]= "[3][ Delete Page? ][OK|CANCEL]";
  254. char delregion[]="[3][ Delete Region? ][OK|CANCEL]";
  255. char not_found[]="[1][ File Not Found! ][CONTINUE]";
  256. char dprint[]   ="[2][ Commence Printing? ][OK|CANCEL]";
  257. char scanerr[] = "[3][ Unable to Open|Scanner Workstation!][EXIT DESKSET]";
  258. char preverr[] = "[3][ Unable to Open|Preview Workstation!][EXIT DESKSET]";
  259. char quiter[]  = "[3][ Do you really want to QUIT? ][QUIT|CANCEL]";
  260.  
  261. char *gtype[] = {
  262.               ".NEO",
  263.           ".IMG",
  264.           ".GEM",
  265.           ".PI1"
  266.             };
  267.  
  268.  
  269. char *grid_inch[] =
  270. {
  271.    "1/8 inch",
  272.    "1/4 inch",
  273.    "1/2 inch",
  274.    "1 inch"
  275. };
  276. char *grid_cents[] =
  277. {
  278.    "1/2 centimeter",
  279.    "1 centimeter",
  280.    "2 centimeters",
  281.    "3 centimeters"
  282. };
  283. char *grid_picas[] =
  284. {
  285.    "1 pica",
  286.    "2 picas",
  287.    "3 picas",
  288.    "4 picas"
  289. };
  290.  
  291. char *grid_cicero[] =
  292. {
  293.    "1 ciceros",
  294.    "2 ciceros",
  295.    "3 ciceros",
  296.    "4 ciceros"
  297. };
  298.  
  299.  
  300. char *rcoord_unit[] = 
  301. {
  302.    " Inches      ",
  303.    " Picas       ",
  304.    "Centimeters  ",
  305.    " Ciceros     "
  306. };
  307.  
  308. char *dpagenum[] = {
  309.             " Distance From Top Of Page:   ",
  310.             " Distance From Bottom Of Page:"
  311.            };
  312.  
  313.  
  314.  
  315. /* all are based upon 1301 mu per Horizontal inch         */
  316. /*               1156 mu per Vertical inch           */
  317. /* These are based on the 1301 and 1156 mus            */ 
  318. /*
  319. int hinch_mus[] = {163,325,651,1301};     * inches        *
  320. int vinch_mus[] = {145,289,578,1156};   * 1/8 1/4 1/2 1     *
  321.  
  322. int hcent_mus[] = {256,512,1024,1537};  * 1/2, 1,2,3          *
  323. int vcent_mus[] = {228,455,910,1365};   * 2.54 cm == 1 inch *
  324.  
  325. int hpica_mus[] = {217,434,651,867};    * 1,2,3,4  picas    *
  326. int vpica_mus[] = {193,385,651,771};    * 6 picas == 1 inch *
  327. */
  328.  
  329.  
  330.  
  331. /* These numbers are based upon 1296 and 1152 mus    */
  332. int hinch_mus[] = {162,324,648,1296}; /* inches      */
  333. int vinch_mus[] = {144,288,576,1152}; /* 1/8 1/4 1/2 1  */
  334.  
  335. int hcent_mus[] = {255,510,1020,1531}; /* Centimeters   2.54 cm == 1 inch*/
  336. int vcent_mus[] = {227,454,907,1361};  /* 1/2, 1 2 3 */
  337.  
  338. int hpica_mus[] = {216,432,648,864}; /* 1,2,3,4 picas     */
  339. int vpica_mus[] = {192,384,576,768}; /* 6 picas == 1 inch */
  340.  
  341. int hcicero_mus[] = {231,462,693,924};  /* 1,2,3,4  */
  342. int vcicero_mus[] = {205,410,615,820};    /* ciceros hasn't been touched */
  343.  
  344. OBJECT *ad_menu;                /* Address of menu object */
  345. OBJECT *ad_deskset;                /* Address of About object*/
  346. OBJECT *ad_bkgrnd;                /* Address of BKGRND objct*/
  347. OBJECT *ad_point_size;                /* Set Font Size      */
  348. OBJECT *ad_go_page;                /* Goto page #          */
  349. OBJECT *ad_get_image;
  350. OBJECT *ad_grattr;
  351. OBJECT *artobj;
  352. OBJECT *unitobj;
  353. OBJECT *gridspace;
  354. OBJECT *adpagedef;
  355. OBJECT *adoutput;
  356. OBJECT *adclipobj;
  357. OBJECT *ad_scanoff;
  358. OBJECT *ad_rcoord;
  359. OBJECT *ad_paths;
  360. OBJECT *ad_pcoord;
  361. OBJECT *ftmenu;
  362. OBJECT *ad_settmpl;
  363. OBJECT *ad_pagenum;
  364. OBJECT *ad_autoflow;
  365. OBJECT *ad_dpi;
  366. OBJECT *ad_credits;
  367. OBJECT *ad_info;
  368. OBJECT *ad_filebuf;
  369.  
  370. int maxpat;                /* Graphic screen device limits   */
  371. int maxhatch;
  372. int maxlwidth;
  373. int maxlstyles;
  374.  
  375.  
  376. char    tmpflname[14] = {"________.___"};
  377.  
  378. #define PAGESIZ 8
  379.  
  380. int    aworkx;
  381. int    aworky;
  382. int    aworkw;
  383. int    aworkh;
  384.  
  385.  
  386. int    curfirst_art;        /* beginning of font list */
  387. int    hslider;        /* vertical slider height */
  388. char    pagestr[10];
  389. int *clipe;
  390. int *icdata;
  391. ICONBLK *icnptr;
  392. BITBLK *bgicptr;
  393.  
  394. double atof();
  395. char *pathptr;
  396. char *get_edit();
  397.  
  398. char *dpath1;        /* Pointers to Default paths for Text..*/
  399. char *dpath2;        /* clipboard,Graphics and Docs         */
  400. char *dpath3;        /* in that order...               */
  401. char *dpath4;
  402.  
  403. char pnumtext[PTEXTMAX];
  404. int pstorage[51];    /*******************************************/
  405.             /* int array storage for default parameters*/
  406.             /* Default Save Parameters Format...       */
  407.             /* Base Zero, but of course...           */
  408.             /* (0)  int Preview Size - 50%,100% etc... */
  409.             /* (1)  int Ruler Display - On/Off       */
  410.             /* (2)  int Ruler Units - Metric etc...    */
  411.             /* (3)  int Grid Spacing - Units Etc..     */
  412.             /* (4)  int Grid Display - On/Off          */
  413.             /* (5)  int Snap To Grid - On/Off       */
  414.             /* (6)  int DPI Setting  - X dpi       */
  415.             /* (7)  int DPI Setting  - Y dpi       */
  416.             /* (8)  int Global Font Number           */
  417.             /* (9)  int Global Point Size           */
  418.             /* (10) int Global Set Size           */
  419.             /* (11) int Global Line Space - in Mu's    */
  420.             /* (12) int Kerning - On/Off           */
  421.             /* (13) int Reverse Video - On/Off       */
  422.             /* (14) int Justification           */
  423.             /* (15) int Paper Type - A4,B5,Letter,Legal*/
  424.             /* (16) int Scan Offset - In mu's       */ 
  425.             /* (17) int Fill Type  - Pattern/Hatch     */
  426.             /* (18) int Fill Index               */
  427.             /* (19) int Line Style               */
  428.             /* (20) int Line Width               */
  429.             /* (21) int Repel Mode               */
  430.             /* (22) int Repel Bounds           */
  431.             /* (23) int Boundary Offset           */
  432.             /* (24) int Page Number Font           */
  433.             /* (25) int Page Number Point Size       */
  434.             /* (26) int Page Number Set Size       */
  435.             /* (27) int Page Number Display           */
  436.             /* (28) int Page Number Left Page Just     */
  437.             /* (29) int Page Number Right Page Just    */
  438.             /* (30) int Page Usage               */
  439.             /* (31) int Page Number Vertical Position  */
  440.             /* (32) int Page Number Distance - in Mu's */
  441.             /* (33) int Page Number From---           */
  442.             /* (34) int Page Number To---           */
  443.             /* (35) int Template Usage - Both,Left,Rt  */
  444.             /* (36) int Template Display Location      */
  445.             /* (37) int Manual char. Compensation       */
  446.             /* (38) int Auto. Char Compensation       */
  447.             /* (39) int Hyphenation flag           */
  448.             /* (40) int No. of Sucessive Hyphens       */
  449.             /* (41) int No. of chars Before Hyphen       */
  450.             /* (42) int No. of chars AFter Hyphen       */
  451.             /* (43) int Letterspacing Mode flag        */
  452.             /* (44) int Positive Letter Space in RU    */
  453.             /* (45) int Negative Letter SPace In RU    */
  454.             /* (46) int Minimum Space in RU           */
  455.             /* (47) int Preferred Space In RU       */
  456.             /* (48) int Maximum Space In RU           */
  457.             /* (49) int Pseudo Italic Mode Flag       */
  458.             /* (50) int # of Chars in Page Text       */
  459.             /* (X) char Page Number Text              */
  460.             /* Null                       */
  461.             /*******************************************/
  462.  
  463.  
  464. int *primicons;
  465.  
  466. int info_what;     /* info dialog box - DOC,TEMPLATE,orCLIPBOARD 0,1,2*/
  467. int info_type;   /* info dialog box - TEXT or GRAPHIC - 0,1         */ 
  468.  
  469.  
  470. DINFO *tdinfo_ptr;    /* pointer to first node of text info structure DOC*/
  471. DINFO *gdinfo_ptr;      /* pointer to first node of graphic info struct DOC*/
  472.  
  473. DINFO *ttdinfo_ptr;    /* ptr to first node of text info in template       */
  474. DINFO *tgdinfo_ptr;    /* ptr to first node of graphic info in template   */
  475.  
  476. DINFO *ctdinfo_ptr;    /* empty - null on purpose               */
  477. DINFO *cgdinfo_ptr;    /* ptr to first node of graphic info in clipboard  */
  478.  
  479. int dtcount;        /* number of doc text items.               */
  480. int dgcount;        /* number of doc graphic items             */
  481.  
  482. int ttcount;        /* number of template text items           */
  483. int tgcount;        /* number of template graphic items           */
  484.     
  485. int ctcount;        /* number of clipboard text items - always zero    */
  486. int cgcount;        /* number of clipboard graphic items            */
  487.  
  488. int maincount;        /* number of items in DINFO structure-for active struct*/
  489. DINFO *curdinfo;    /* current dinfo pointer               */
  490.  
  491. ARTICLE *xarthd;    /* temp for testing in set_dtmplate() */
  492.  
  493. int attr_flag[23];    /* attribute flags - 0 if not changed, 1 if changed*/
  494. struct txtattr tmpattr; /* temporary txt attributes structure            */
  495.  
  496.  
  497. /**************************************************************************/
  498. /* Function:    open_resource()                          */
  499. /* Description: Gets Address of Resource objects and displays menu bar.   */
  500. /**************************************************************************/
  501. open_resource()
  502. {
  503.     int fullx,fully,fullw,fullh;
  504.  
  505.     rsrc_gaddr(0,MENU,&ad_menu);        /* menu...        */
  506.     rsrc_gaddr(0,DESKSET,&ad_deskset);        /* About Dialog   */
  507.     rsrc_gaddr(0,BKGRND,&ad_bkgrnd);
  508.     rsrc_gaddr(0,FONTSIZE,&ad_point_size);
  509.     rsrc_gaddr(0,GOPAGE,&ad_go_page);
  510.     rsrc_gaddr(0,PICTYPE,&ad_get_image);
  511.     rsrc_gaddr(0,GRATTR,&ad_grattr);
  512.     rsrc_gaddr(0,ARTSEL,&artobj);
  513.     rsrc_gaddr(0,MEASURE,&unitobj);
  514.     rsrc_gaddr(0,GRIDSP,&gridspace);
  515.     rsrc_gaddr(0,PAGESIZE,&adpagedef);
  516.     rsrc_gaddr(0,OUTPUT,&adoutput);
  517.     rsrc_gaddr(0,CLIPTREE,&adclipobj);
  518.     rsrc_gaddr(0,SCANOFF,&ad_scanoff);
  519.     rsrc_gaddr(0,REGCOORD,&ad_rcoord);
  520.     rsrc_gaddr(0,PATHS,&ad_paths);
  521.     rsrc_gaddr(0,PRMCOORD,&ad_pcoord);
  522.     rsrc_gaddr(0,FONTMAN,&ftmenu);
  523.     rsrc_gaddr(0,SETTMPL,&ad_settmpl);
  524.     rsrc_gaddr(0,PAGENUMS,&ad_pagenum);
  525.     rsrc_gaddr(0,AUTOFL,&ad_autoflow);
  526.     rsrc_gaddr(0,DOTS,&ad_dpi);
  527.     rsrc_gaddr(0,CREDITS,&ad_credits);
  528.     rsrc_gaddr(0,DOCINFO,&ad_info);
  529.     rsrc_gaddr(0,FILEBUF,&ad_filebuf);
  530.  
  531.     wind_get(0,WF_WORKXYWH,&fullx,&fully,&fullw,&fullh);
  532.     ad_bkgrnd[0].ob_x         = fullx;
  533.     ad_bkgrnd[0].ob_y       = fully;
  534.     ad_bkgrnd[0].ob_width   = fullw;
  535.     ad_bkgrnd[0].ob_height  = fullh;
  536.     ad_bkgrnd[BOOKOBJ].ob_x = xbook;
  537.     if(splane == 2)    /* color med res */
  538.         ad_bkgrnd[BOOKOBJ].ob_y = ybook - 3;
  539.     else
  540.     ad_bkgrnd[BOOKOBJ].ob_y = ybook - 11;
  541.     ad_bkgrnd[CLIPOBJ].ob_y = ybook - 16;
  542.     ad_bkgrnd[CLIPOBJ].ob_x = xbook - ad_bkgrnd[BOOKOBJ].ob_width - 10;
  543.  
  544.     set_int(adoutput,OCOPIES,1);
  545.     set_int(adoutput,OTOPAGE,1);
  546.     set_int(adoutput,OFROMPAG,1);
  547.  
  548.     icnptr = ad_bkgrnd[CLIPOBJ].ob_spec;
  549.     bgicptr = ad_bkgrnd[BGICON].ob_spec;
  550.     
  551.     clipe = icnptr->ib_pdata;
  552.     if(splane == 2)                /* medium res */
  553.     {
  554.         bgicptr->bi_pdata = bgmed1;
  555.     icdata = bgmed1;
  556.     primicons = bgmed2;
  557.         bgicptr->bi_wb = 0x0008;        /* 8 bytes across */
  558.     bgicptr->bi_hl = 0x00c1;
  559.     }
  560.     else
  561.     {
  562.         icdata = bgicptr->bi_pdata;        /* at least hi resolution */
  563.     primicons = bgmono2;
  564.     }
  565.     do_pagenum(1,1);                /* Page 1, 0 = left side */
  566.     form_dial(0,0,0,0,0,0,16,sxres,syres-16);
  567.     wind_set(0,WF_NEWDESK,ad_bkgrnd,0,0);
  568.     objc_draw(ad_bkgrnd,ROOT,MAX_DEPTH,0,fully,sxres,syres);
  569.     
  570.     ad_menu[TEXT].ob_state = DISABLED;
  571.     menu_bar(ad_menu,TRUE);
  572.     menu_ienable(ad_menu,AAUTOFL,FALSE);
  573. }
  574.  
  575.  
  576. /**************************************************************************/
  577. /* Function: get_range()                          */
  578. /* Description: Get rang efor autoflow pages...                  */
  579. /**************************************************************************/
  580. get_range(min,max)
  581. int *min;
  582. int *max;
  583. {
  584.    int button;
  585.  
  586.    set_int(ad_autoflow,AFFROM,0);
  587.    set_int(ad_autoflow,AFTO,0);
  588.    button = execform(ad_autoflow,AFFROM);
  589.    ad_autoflow[button].ob_state = NORMAL;
  590.    *min = get_int(ad_autoflow,AFFROM);
  591.    *max = get_int(ad_autoflow,AFTO);
  592.    if(button == AFOK)
  593.     return(1);
  594.    else
  595.     return(0);
  596. }
  597.    
  598.  
  599.  
  600. /**************************************************************************/
  601. /* Function: do_pagenum()                          */
  602. /* Description: Handles the book icon                      */
  603. /**************************************************************************/
  604. do_pagenum(num,side)
  605. int num;
  606. int side;
  607. {
  608.    register ICONBLK *icnptr;
  609.    register int width;
  610.    int height;
  611.    int tflag;
  612.  
  613.    icnptr = ad_bkgrnd[BOOKOBJ].ob_spec;
  614.    width = ad_bkgrnd[BOOKOBJ].ob_width;
  615.    height = ad_bkgrnd[BOOKOBJ].ob_height;
  616.    icnptr->ib_wtext = 18;
  617.    icnptr->ib_htext = 6;
  618.    icnptr->ib_ytext = height/4;            /* one fourth down screen */    
  619.    if(!side)                    /* LEFT side  */
  620.    {
  621.     pageside = 0;
  622.     icnptr->ib_xtext = width/8;
  623. /*        pagestr[0] = 'L';*/
  624.     strcpy(pagestr,"L  ");
  625.    } 
  626.    else
  627.    {
  628.     pageside = 1;
  629.     icnptr->ib_xtext = (5*width)/8;
  630. /*        pagestr[0] = 'R';*/
  631.     strcpy(pagestr,"R  ");
  632.    }
  633.  
  634.    if(!tmplate_flag)
  635.        itoa(num,pagestr);
  636.    icnptr->ib_ptext = pagestr;
  637.    draw_book();
  638.  
  639.    if(ad_menu[RCLOSE].ob_state == 0x0)
  640.    {
  641.      tflag = article_flag;
  642.      article_flag = TRUE;
  643.          close_region();
  644.      article_flag = tflag;
  645.      if(!article_flag)
  646.         graf_mouse(0,&dummy);    /* arrow then... */
  647.    }
  648.  
  649. }
  650.  
  651.  
  652.  
  653.  
  654. /**************************************************************************/
  655. /* Function: draw_book()                          */
  656. /* Description: Draw the book icon                      */
  657. /**************************************************************************/
  658. draw_book()
  659. {
  660. int x,y,w,h;
  661.        wind_get(prev_handle,WF_CURRXYWH,&x,&y,&w,&h);
  662.        if(x + w >= xbook && y + h >= ybook)
  663.         return;
  664.        wind_get(txt_handle,WF_CURRXYWH,&x,&y,&w,&h);
  665.        if(x + w >= xbook && y + h >= ybook)
  666.         return;
  667.        Vsync();
  668.        objc_draw(ad_bkgrnd,BOOKOBJ,1,xbook,ybook,
  669.         sxres - xbook,syres - ybook);   
  670. }
  671.  
  672.    
  673.  
  674. /**************************************************************************/
  675. /* Function:    close_resource()                      */
  676. /* Description: Closes menu bar and releases resources.              */
  677. /**************************************************************************/
  678. close_resource()
  679. {
  680.     menu_bar(ad_menu,FALSE);
  681.     form_dial(3,0,0,0,0,0,16,sxres,syres-16);    
  682.     rsrc_free();
  683. }
  684.  
  685.  
  686.  
  687. /**************************************************************************/
  688. /* Function:     execform()                          */
  689. /* Description:  Put up a Dialog Box                      */
  690. /* IN:  the_tree   - tree OBJECT                      */
  691. /*      crsr_pos   - object to place cursor on...              */
  692. /* OUT: returns button pressed.                          */
  693. /**************************************************************************/
  694. execform(the_tree,crsr_pos)
  695. register OBJECT the_tree[];
  696. int    crsr_pos;            
  697. {
  698.   int x,y,w,h;
  699.   int button;
  700.  
  701.         active_prim = FALSE;
  702.       form_center(the_tree,&x,&y,&w,&h);
  703.       the_tree[0].ob_x = x + 3;
  704.     the_tree[0].ob_y = y + 3;
  705.     form_dial(0,0,0,36,36,x,y,w,h);
  706.     form_dial(1,0,0,36,36,x,y,w,h);
  707.     objc_draw(the_tree,0,MAX_DEPTH,x,y,w,h);
  708.     button = form_do(the_tree,crsr_pos);
  709.     form_dial(2,0,0,36,36,x,y,w,h);
  710.     form_dial(3,0,0,36,36,x,y,w,h);  
  711.     return(button);
  712. }
  713.  
  714.  
  715.  
  716. /**************************************************************************/
  717. /* Function:     get_int()                          */
  718. /* Description:  Convert ob_spec ascii to int                  */
  719. /* IN:  tree  - address of OBJECT                      */
  720. /*      obj   - object in question                      */
  721. /* OUT: returns integer                              */
  722. /**************************************************************************/
  723. get_int(tree,obj)
  724. OBJECT *tree;
  725. int obj;
  726. {
  727.      long *str1;
  728.  
  729.      str1 = tree[obj].ob_spec;
  730.      return(atoi(*str1));
  731. }
  732.  
  733.  
  734.  
  735. /**************************************************************************/
  736. /* Function:     set_int()                          */
  737. /* Description:  Inserts an ascii string into the dialog box.          */
  738. /* IN:  tree  - address OBJECT of tree in question              */
  739. /*    obj   - object in dialog box in question              */
  740. /*    num   - number to insert                      */
  741. /* OUT: none                                    */
  742. /**************************************************************************/
  743. set_int(tree,obj,num)
  744. OBJECT *tree;
  745. int obj;
  746. int num;
  747. {
  748.      char str[4];
  749.      long *str1;
  750.  
  751.      itoa(num,str);
  752.      str1 = tree[obj].ob_spec;
  753.      strcpy(*str1,str);
  754. }
  755.  
  756.  
  757.  
  758. /**************************************************************************/
  759. /* Function: get_float()                          */
  760. /* Description: ASCII ob_spec to float                      */
  761. /**************************************************************************/
  762. double get_float(tree,obj)
  763. OBJECT *tree;
  764. int obj;
  765. {
  766.      long *str1;
  767.  
  768.      str1 = tree[obj].ob_spec;
  769.      return(atof(*str1));
  770. }
  771.  
  772.  
  773.  
  774. /**************************************************************************/
  775. /* Function: set_float()                          */
  776. /* Description: float to ASCII ob_spec                      */
  777. /**************************************************************************/
  778. set_float(tree,object,num)
  779. OBJECT *tree;
  780. int object;
  781. double num;
  782. {
  783.    char str[64];
  784.    long *str1;
  785.    char *s;
  786.  
  787.    s = gcvt(num,4,str);
  788.    str1 = tree[object].ob_spec;
  789.    strcpy( *str1,s);
  790. }
  791.  
  792.  
  793.  
  794.  
  795.  
  796. /**************************************************************************/
  797. /* Function: draw_fbox()                          */
  798. /* Description: Draw Fill box in graphical dialog              */
  799. /**************************************************************************/
  800. draw_fbox(patmode)
  801. int patmode;
  802. {
  803.    int pxyarray[4];
  804.    register int styleflag;
  805.    int xpos,ypos;
  806.  
  807.    objc_offset(ad_grattr,FBOX,&xpos,&ypos);
  808.    
  809.    if(patmode)
  810.    {
  811.     if(gl_findex == maxpat)
  812.         styleflag = 0;
  813.     else 
  814.         styleflag = 2;
  815.    }
  816.    else
  817.     styleflag = 3;            /* Else hatch   */
  818.  
  819.    gsx_moff();
  820.    vsf_interior(shandle,styleflag);
  821.    vsf_style(shandle,gl_findex);
  822.    pxyarray[0] = xpos;
  823.    pxyarray[1] = ypos;
  824.    pxyarray[2] = pxyarray[0] + ad_grattr[FBOX].ob_width - 1;
  825.    pxyarray[3] = pxyarray[1] + ad_grattr[FBOX].ob_height - 1;
  826.    v_bar(shandle,pxyarray);
  827.    gsx_mon();
  828. }
  829.  
  830.  
  831.  
  832.  
  833. /**************************************************************************/
  834. /* Function: draw_lbox()                          */
  835. /* Description: Draw line box in graphics dialog              */
  836. /**************************************************************************/
  837. draw_lbox(wider)
  838. int wider;
  839. {
  840.    int pxyarray[4];
  841.    int xpos,ypos;
  842.  
  843.    objc_offset(ad_grattr,LBOX,&xpos,&ypos);
  844.    pxyarray[0] = xpos;
  845.    pxyarray[1] = ypos;
  846.    pxyarray[2] = pxyarray[0] + ad_grattr[LBOX].ob_width - 1;
  847.    pxyarray[3] = pxyarray[1] + ad_grattr[LBOX].ob_height - 1;
  848.    gsx_moff();
  849.    if(!wider)
  850.    {
  851.       vsf_interior(shandle,0);
  852.       v_bar(shandle,pxyarray);
  853.    }
  854.    vsl_type(shandle,gl_lstyle);
  855.    vsl_width(shandle,1);
  856.    pxyarray[1] = pxyarray[3] = ypos + (ad_grattr[LBOX].ob_height/2);
  857.    v_pline(shandle,2,pxyarray);
  858.    gsx_mon();
  859. }
  860.  
  861.  
  862.  
  863.  
  864. /**************************************************************************/
  865. /* Function: do_grdialog()                          */
  866. /* Description: Handle graphics attribute dialog box              */
  867. /**************************************************************************/
  868. do_grdialog()
  869. {
  870.    int x,y,w,h;
  871.    int obj;
  872.    int cont;
  873.    int okflag;
  874.    int tmp_lstyle,tmp_lwidth;
  875.    int tmp_fstyle,tmp_findex;
  876.    int tmp_repel;
  877.    int tmp_repoffset;
  878.    int tmp_repbounds;
  879.    int tmpxy[4];
  880.    register int i;
  881.    int output_done;
  882.    register REGION *rptr;
  883.    int perimeter;
  884.    int patmode;
  885.    int oldrect[4];
  886.    int dummy;
  887.  
  888.   
  889.    vs_clip(shandle,0,tmpxy);
  890.  
  891.  
  892.    if(region_ptr)
  893.    {
  894.     if(region_ptr == gl_grregion_ptr)
  895.     {
  896.        gl_region_ptr = 0L;
  897.            get_grattr(gl_grregion_ptr,glgrattr);
  898.            gl_lstyle = glgrattr[0];
  899.            gl_lwidth = glgrattr[1];
  900.            gl_fstyle = glgrattr[2];
  901.            gl_findex = glgrattr[3];
  902.        gl_repel  = glgrattr[4];
  903.        gl_repbounds = glgrattr[6];
  904.        gl_repoffset = glgrattr[5];
  905.         }
  906.    }
  907.    tmp_lstyle = gl_lstyle;
  908.    tmp_lwidth = gl_lwidth;
  909.    tmp_fstyle = gl_fstyle;
  910.    tmp_findex = gl_findex;
  911.    tmp_repel = gl_repel;
  912.    tmp_repoffset = gl_repoffset;
  913.    tmp_repbounds = gl_repbounds;
  914.  
  915.    perimeter = gl_fstyle & 0x8000;
  916.    gl_fstyle &= 0x7fff;
  917.  
  918.    ad_grattr[FPATTERN].ob_state = NORMAL;
  919.    ad_grattr[FHATCH].ob_state = NORMAL;
  920.  
  921.    if(gl_fstyle == 2)
  922.    {
  923.     ad_grattr[FPATTERN].ob_state = SELECTED;
  924.     patmode = 1;
  925.    }
  926.    else
  927.    {
  928.     ad_grattr[FHATCH].ob_state = SELECTED;
  929.     patmode = 0;
  930.    }
  931.  
  932.    set_int(ad_grattr,GRBOFF,gl_repoffset);
  933.  
  934.    if(perimeter)
  935.    {
  936.     ad_grattr[PERIMON].ob_state = SELECTED;
  937.         ad_grattr[PERIMOFF].ob_state = NORMAL;
  938.    }
  939.    else
  940.    {
  941.     ad_grattr[PERIMON].ob_state = NORMAL;
  942.     ad_grattr[PERIMOFF].ob_state = SELECTED;
  943.    }
  944.  
  945.    if(gl_lwidth)
  946.    {
  947.     ad_grattr[GRPIXWID].ob_state = NORMAL;
  948.         ad_grattr[GRPTSWID].ob_state = SELECTED;
  949.     set_int(ad_grattr,GRLWID,gl_lwidth);
  950.    }
  951.    else
  952.    {
  953.     ad_grattr[GRPTSWID].ob_state = NORMAL;
  954.         ad_grattr[GRPIXWID].ob_state = SELECTED;
  955.     set_int(ad_grattr,GRLWID,0);
  956.    }
  957.  
  958.    for(i=GRTHRU;i<=GRAROUND;i++)
  959.         ad_grattr[i].ob_state = NORMAL;
  960.  
  961.    ad_grattr[gl_repel + GRTHRU].ob_state = SELECTED;
  962.  
  963.    ad_grattr[RPLREG].ob_state = NORMAL;
  964.    ad_grattr[RPLIMG].ob_state = NORMAL;
  965.    ad_grattr[gl_repbounds + RPLREG].ob_state = SELECTED;
  966.  
  967.  
  968.    form_center(ad_grattr,&x,&y,&w,&h);
  969.    form_dial(0,0,0,36,36,x,y,w,h);
  970.    objc_draw(ad_grattr,0,MAX_DEPTH,x,y,w,h);
  971.    draw_fbox(patmode);
  972.    draw_lbox(1);
  973.    do
  974.    {
  975.      obj = form_do(ad_grattr,0);
  976.        obj &= 0x7fff;
  977.      cont = hndl_box(obj,&okflag);
  978.    }while(cont);
  979.    for(i = GRTHRU;i <= GRAROUND;i++)
  980.    {
  981.       if(ad_grattr[i].ob_state == SELECTED)
  982.       {
  983.     ad_grattr[i].ob_state = NORMAL;
  984.     gl_repel = i - GRTHRU;
  985.     break;
  986.       }
  987.    }
  988.    if(ad_grattr[RPLREG].ob_state == SELECTED)
  989.    {
  990.     ad_grattr[RPLREG].ob_state = NORMAL;
  991.     gl_repbounds = 0;
  992.    }
  993.    else
  994.    {
  995.     ad_grattr[RPLIMG].ob_state = NORMAL;
  996.     gl_repbounds = 1;
  997.    }
  998.    gl_repoffset = get_int(ad_grattr,GRBOFF);
  999.    if(ad_grattr[PERIMON].ob_state == SELECTED)
  1000.     perimeter = TRUE;
  1001.    else
  1002.     perimeter = FALSE;
  1003.    if(ad_grattr[GRPIXWID].ob_state == SELECTED)
  1004.     gl_lwidth = 0;
  1005.    else
  1006.     gl_lwidth = get_int(ad_grattr,GRLWID);
  1007.    if(!okflag)
  1008.    {
  1009.     gl_lstyle = tmp_lstyle;
  1010.         gl_lwidth = tmp_lwidth;
  1011.       gl_fstyle = tmp_fstyle;
  1012.     gl_findex = tmp_findex;
  1013.     gl_repel  = tmp_repel;
  1014.         gl_repbounds = tmp_repbounds;
  1015.        gl_repoffset = tmp_repoffset;
  1016.    }
  1017.  
  1018.    form_dial(3,0,0,36,36,x,y,w,h);
  1019.    check_top_window();
  1020.  
  1021.    if(okflag)
  1022.    {
  1023.         if(perimeter)
  1024.        gl_fstyle |= 0x8000;                /* perimeter set */
  1025.         if(multi_mode)
  1026.         {
  1027.        output_done = 1;
  1028.        rptr = curpage->regptr;
  1029.            while(rptr)
  1030.        {
  1031.           if(rptr->multi_select && rptr->type)
  1032.           {
  1033.                find_boundary(rptr,&oldrect[0],&oldrect[1],&oldrect[2],&oldrect[3],&dummy,&dummy);
  1034.                 redraw_spot(rptr,oldrect,0);    /* cjg - to clear out old rectangle */
  1035.                  glgrattr[0] = gl_lstyle;    /* Set up graphic attributes */
  1036.              glgrattr[1] = gl_lwidth;
  1037.              glgrattr[2] = gl_fstyle;
  1038.              glgrattr[3] = gl_findex;
  1039.          glgrattr[4] = gl_repel;
  1040.          glgrattr[5] = gl_repoffset;
  1041.              glgrattr[6] = gl_repbounds;
  1042.  
  1043.                  put_grattr(rptr,glgrattr);
  1044.              if((tmp_repel != gl_repel) || (tmp_repoffset != gl_repoffset)
  1045.                    || (tmp_repbounds != gl_repbounds))
  1046.              {
  1047.                 update_repel(0,0L);
  1048.                  }
  1049.          else
  1050.          {
  1051.               redr_regarea(rptr,1);
  1052.           }
  1053.           }
  1054.           rptr = rptr->plink;
  1055.         }    
  1056.     }
  1057.     else if(gl_grregion_ptr)     
  1058.         {
  1059.        find_boundary(gl_grregion_ptr,&oldrect[0],&oldrect[1],&oldrect[2],&oldrect[3],&dummy,&dummy);
  1060.            redraw_spot(gl_grregion_ptr,oldrect,0);  /* to clear out old rectangle */
  1061.            glgrattr[0] = gl_lstyle;          /* Set up graphic attributes */
  1062.            glgrattr[1] = gl_lwidth;
  1063.            glgrattr[2] = gl_fstyle;
  1064.            glgrattr[3] = gl_findex;
  1065.        glgrattr[4] = gl_repel;
  1066.        glgrattr[5] = gl_repoffset;
  1067.            glgrattr[6] = gl_repbounds;
  1068.  
  1069.            put_grattr(gl_grregion_ptr,glgrattr); /* and store in region  */
  1070.        if((tmp_repel != gl_repel) || (tmp_repoffset != gl_repoffset)
  1071.                    || (tmp_repbounds != gl_repbounds))
  1072.        {
  1073.           update_repel(0,0L);
  1074.           output_done = 1;
  1075.            }
  1076.        else
  1077.           output_done = 0;
  1078.     }
  1079.  
  1080.         if((graph_flag || gl_grregion_ptr)&&!output_done)
  1081.         {
  1082.            redr_regarea(gl_grregion_ptr,1);
  1083.         }
  1084.  
  1085.    }
  1086.    screen_clip();
  1087. }
  1088.  
  1089.  
  1090.  
  1091.  
  1092. /**************************************************************************/
  1093. /* Function: hndl_box()                              */
  1094. /* Descriptio: Handle box once object is found                  */
  1095. /**************************************************************************/
  1096. hndl_box(obj,okflag)
  1097. int obj;
  1098. int *okflag;
  1099. {
  1100.    int patmode;
  1101.    int cont;
  1102.    cont = 1;
  1103.    *okflag = 1;
  1104.  
  1105.    if(ad_grattr[FPATTERN].ob_state == SELECTED)
  1106.    {
  1107.     gl_fstyle = 2;
  1108.     patmode = 1;
  1109.    }
  1110.    else
  1111.    {
  1112.     gl_fstyle = 3; 
  1113.     patmode = 0;
  1114.    }
  1115.  
  1116.    switch(obj)
  1117.    {
  1118.     case FINDEXL:
  1119.         if(gl_findex > 1)
  1120.            gl_findex -= 1;
  1121.         else
  1122.         {
  1123.            if(patmode)
  1124.             gl_findex = maxpat;
  1125.            else
  1126.              gl_findex = maxhatch;
  1127.         
  1128.         }
  1129.         draw_fbox(patmode);
  1130.         break;
  1131.  
  1132.     case FINDEXR:
  1133.         if(patmode)
  1134.          {
  1135.            if(gl_findex >= maxpat)
  1136.             gl_findex = 1;
  1137.            else 
  1138.             gl_findex += 1;
  1139.         }
  1140.         else
  1141.         {
  1142.            if(gl_findex >= maxhatch)
  1143.             gl_findex = 1;
  1144.            else
  1145.             gl_findex += 1;
  1146.         }
  1147.         draw_fbox(patmode);
  1148.         break;
  1149.     case FPATTERN:
  1150.         gl_fstyle = 2;
  1151.         draw_fbox(1);
  1152.         break;
  1153.     case FHATCH:
  1154.         gl_fstyle = 3;
  1155.         if(gl_findex > maxhatch)
  1156.             gl_findex = maxhatch;
  1157.         draw_fbox(0);
  1158.         break;
  1159.     case LSTYLEL:
  1160.         if(gl_lstyle > 1)
  1161.             gl_lstyle -= 1;
  1162.         else
  1163.             gl_lstyle = maxlstyles;
  1164.         draw_lbox(1);
  1165.         break;
  1166.     case LSTYLER:
  1167.         if(gl_lstyle == maxlstyles)
  1168.             gl_lstyle = 1;
  1169.         else
  1170.             gl_lstyle += 1;
  1171.         draw_lbox(1);
  1172.         break;
  1173.     case GROK:
  1174.         ad_grattr[GROK].ob_state = NORMAL;
  1175.         cont = 0;
  1176.         break;
  1177.     case GRCANCEL:
  1178.         ad_grattr[GRCANCEL].ob_state = NORMAL;
  1179.         *okflag = 0;
  1180.         cont = 0;
  1181.         break;
  1182.     }
  1183.     return cont;
  1184. }
  1185.  
  1186.  
  1187.         
  1188.  
  1189.  
  1190. /**************************************************************************/
  1191. /* Function:    do_point_size()                          */
  1192. /* Description: Set Current Point Size                      */
  1193. /**************************************************************************/
  1194. do_point_size()
  1195. {
  1196.      int button;
  1197.      int tmplnsp;
  1198.      long *str1;
  1199.      long str2;
  1200.      int x,y,w,h;
  1201.      int x1,y1;
  1202.      int fnt;
  1203.      int pxy[4];
  1204.      register int findex;
  1205.      int *fntptr;
  1206.      int found;
  1207.      int sobj;
  1208.      int jtype;
  1209.  
  1210.      clr_attr_flag();
  1211.  
  1212.      if(region_ptr)
  1213.      {
  1214.     if(gl_region_ptr == region_ptr)
  1215.     {
  1216.       gl_grregion_ptr = 0L;
  1217.       get_txtattr(gl_region_ptr,&gltxtattr);
  1218.       update_point_dialog();
  1219.     }
  1220.      }
  1221.  
  1222.      fnt = gltxtattr.font;
  1223.      findex = found = 0;
  1224.      for(findex = 0; findex < 16;findex++)
  1225.      {
  1226.     fntptr = ftlib + (findex*SFTSIZ);
  1227.     if(fnt == *fntptr)
  1228.     {
  1229.        found = 1;
  1230.        break;
  1231.     }
  1232.      }
  1233.      if(!found)
  1234.     findex = 0;
  1235.     
  1236.      str1 = ad_point_size[FNTNME].ob_spec;
  1237.      
  1238.      str2 = ftlib + ((findex * SFTSIZ)+TFNOFS); 
  1239.      strcpy(*str1,str2);
  1240.  
  1241.      update_point_dialog();
  1242.     
  1243.      ad_point_size[FKERNON].ob_state = NORMAL;
  1244.      ad_point_size[FKERNOFF].ob_state = NORMAL;
  1245.      ad_point_size[FREVON].ob_state = NORMAL;
  1246.      ad_point_size[FREVOFF].ob_state = NORMAL;
  1247.  
  1248.      if(gltxtattr.kernmd)
  1249.     ad_point_size[FKERNON].ob_state = SELECTED;
  1250.      else
  1251.     ad_point_size[FKERNOFF].ob_state = SELECTED;
  1252.  
  1253.      if(gltxtattr.rvomd)
  1254.     ad_point_size[FREVON].ob_state = SELECTED;
  1255.      else
  1256.     ad_point_size[FREVOFF].ob_state = SELECTED;
  1257.  
  1258.      form_center(ad_point_size,&x,&y,&w,&h);
  1259.      form_dial(0,0,0,36,36,x,y,w,h);
  1260.      objc_draw(ad_point_size,0,MAX_DEPTH,x,y,w,h);
  1261.  
  1262.      objc_offset(ad_point_size,FNTNME,&x1,&y1);
  1263.      pxy[0] = x1;
  1264.      pxy[1] = y1;
  1265.      pxy[2] = x1 + ad_point_size[FNTNME].ob_width - 1;
  1266.      pxy[3] = y1 + ad_point_size[FNTNME].ob_height - 1;
  1267.      vsf_interior(shandle,0);
  1268.  
  1269.      sobj = FONTNUM;
  1270. err: do
  1271.      {
  1272.     button = form_do(ad_point_size,sobj);
  1273.      button &= 0x7fff;
  1274.         if((button == FNTFWD) || (button == FNTBAK))
  1275.     {
  1276.        if(button == FNTFWD)
  1277.           findex += 1;
  1278.        else
  1279.           findex -= 1;
  1280.        if(findex < 0)
  1281.           findex = 15;
  1282.        if(findex > 15)
  1283.           findex = 0;
  1284.             str2 = ftlib + ((findex * SFTSIZ)+TFNOFS); 
  1285.             strcpy(*str1,str2);       
  1286.        v_bar(shandle,pxy);
  1287.        objc_draw(ad_point_size,FNTNME,1,x,y,w,h);
  1288.        fntptr = ftlib + (findex*SFTSIZ);
  1289.        set_int(ad_point_size,FONTNUM,*fntptr);       
  1290.        objc_draw(ad_point_size,FONTNUM,1,x,y,w,h);        
  1291.     }
  1292.      } while((button != FOK) && (button != FCANCEL));
  1293.  
  1294.  
  1295.      ad_point_size[button].ob_state = NORMAL;
  1296.      if(button == FOK)
  1297.      {
  1298.         tmplnsp = (int)gltxtattr.lnsp;
  1299.     attr_flag[2] = 1;
  1300.         do_font_info(ad_point_size,FONTNUM,999,1,&gltxtattr.font);
  1301.         attr_flag[5] = 1;
  1302.  
  1303.     if(!parmcheck(ad_point_size,FNTSIZE,2,0))
  1304.     {
  1305.             gltxtattr.ptsz = Pval;
  1306.             attr_flag[3] = 1;
  1307.     }
  1308.         else
  1309.         {
  1310.      sobj = FNTSIZE;
  1311.          objc_draw(ad_point_size,button,1,x,y,w,h);
  1312.          goto err;
  1313.         }
  1314.     
  1315.         if(!parmcheck(ad_point_size,SSETSIZE,2,0))
  1316.         {
  1317.             gltxtattr.ssiz = Pval;
  1318.             attr_flag[4] = 1;            
  1319.     }
  1320.     else
  1321.     {
  1322.      sobj = SSETSIZE;
  1323.          objc_draw(ad_point_size,button,1,x,y,w,h);
  1324.      goto err;
  1325.     }
  1326.  
  1327.  
  1328.         jtype = unit_type;
  1329.     unit_type = 1;    /* points */
  1330.     if(!parmcheck(ad_point_size,LINESPCE,4,0)) /* used to be a 4 */
  1331.     {
  1332.                 unit_type = jtype;
  1333.             gltxtattr.lnsp = (long)Pval;
  1334.             attr_flag[2] = 1;
  1335.      }
  1336.         else
  1337.     {
  1338.       unit_type = jtype;
  1339.       sobj = LINESPCE;
  1340.           objc_draw(ad_point_size,button,1,x,y,w,h);
  1341.       goto err;
  1342.     }
  1343.  
  1344.  
  1345.  
  1346.         if(ad_point_size[FKERNON].ob_state == SELECTED)
  1347.         {
  1348.        gltxtattr.kernmd = 1;
  1349.        ad_point_size[FKERNON].ob_state = NORMAL;
  1350.         }
  1351.     else
  1352.     {
  1353.        gltxtattr.kernmd = 0;
  1354.        ad_point_size[FKERNOFF].ob_state = NORMAL;
  1355.     }
  1356.     attr_flag[8] = 1;
  1357.  
  1358.         if(ad_point_size[FREVON].ob_state == SELECTED)
  1359.         {
  1360.        gltxtattr.rvomd = 1;
  1361.        ad_point_size[FREVON].ob_state = NORMAL;
  1362.         }
  1363.     else
  1364.     {
  1365.        gltxtattr.rvomd = 0;
  1366.        ad_point_size[FREVOFF].ob_state = NORMAL;
  1367.     }
  1368.         attr_flag[19] = 1;
  1369.      }
  1370.      update_point_dialog();
  1371.      form_dial(3,0,0,3,36,x,y,w,h);
  1372.      zdevice = SCANNER;
  1373.      SH = vmutopix((int)gltxtattr.lnsp);
  1374.      
  1375.      if(button == FOK)
  1376.      {
  1377.      upd_txt_attributes();
  1378.      }
  1379.  
  1380. }
  1381.  
  1382.  
  1383.  
  1384. /************************************************************************/
  1385. /* Function: upd_txt_attributes()                    */
  1386. /* Description: Stuff global attributes into the proper regions(s)      */
  1387. /************************************************************************/
  1388. upd_txt_attributes()
  1389. {
  1390.   register REGION *rptr;
  1391.   int found;     
  1392.   long art;
  1393.   struct txtattr locattr;
  1394.  
  1395.    if(multi_mode)
  1396.    {
  1397.            f_move(&gltxtattr.llen,&locattr.llen,sizeof(struct txtattr));
  1398.        rptr = curpage->regptr;
  1399.        while(rptr)
  1400.        {
  1401.           get_txtattr(rptr,&tmpattr);
  1402.  
  1403.           if(rptr->multi_select && !rptr->type)
  1404.           {
  1405.                    f_move(&locattr.llen,&gltxtattr.llen,sizeof(struct txtattr));
  1406.            copy_attr(&tmpattr);
  1407.            put_txtattr(rptr,&tmpattr);
  1408.             art = get_regart(rptr);
  1409.            if(art)
  1410.            {
  1411.             open_article(art);
  1412.             do_artcleanup(rptr,0);
  1413.            }
  1414.           }
  1415.           rptr = rptr->plink;
  1416.        }
  1417.        force_preview();
  1418.    }
  1419.    else if(gl_region_ptr)
  1420.    {
  1421.       put_txtattr(gl_region_ptr,&gltxtattr);
  1422.       page_redraw(gl_region_ptr);
  1423.    }
  1424. }
  1425.  
  1426.  
  1427.  
  1428. /**************************************************************************/
  1429. /* Function: do_scoffset()                          */
  1430. /* Description: Dialog to handle scan offset                  */
  1431. /**************************************************************************/
  1432. do_scoffset()
  1433. {
  1434.      int button;
  1435.      int x,y,w,h;
  1436.      int jtype;
  1437.  
  1438.      clr_attr_flag();
  1439.  
  1440.      jtype = unit_type;
  1441.      unit_type = 1;
  1442.      to_mu_vlrv(ad_scanoff,gltxtattr.scoff,SSCANVAL);
  1443.      unit_type = jtype;
  1444.  
  1445.      form_center(ad_scanoff,&x,&y,&w,&h);
  1446.      form_dial(0,0,0,36,36,x,y,w,h);
  1447.      objc_draw(ad_scanoff,0,MAX_DEPTH,x,y,w,h);
  1448.      
  1449. err:
  1450.      button = form_do(ad_scanoff,SSCANVAL);
  1451.      ad_scanoff[button].ob_state = NORMAL;
  1452.      if(button == SCANOK)
  1453.      {
  1454.      jtype = unit_type;
  1455.      unit_type = 1;
  1456.      if(!parmcheck(ad_scanoff,SSCANVAL,4,0)) /* used to be a 4 */
  1457.      {
  1458.         unit_type = jtype;
  1459.         gltxtattr.scoff = Pval;
  1460.         attr_flag[22] = 1;
  1461.         upd_txt_attributes();
  1462.      }
  1463.      else
  1464.      {
  1465.         unit_type = jtype;
  1466.         objc_draw(ad_scanoff,button,1,x,y,w,h);
  1467.         goto err;
  1468.      }
  1469.      }
  1470.      form_dial(3,0,0,3,36,x,y,w,h);
  1471. }
  1472.  
  1473.  
  1474.  
  1475.  
  1476.  
  1477. /**************************************************************************/
  1478. /* Function:    do_go_page()                          */
  1479. /* Description: Set Current Page Number                      */
  1480. /**************************************************************************/
  1481. do_go_page()
  1482. {
  1483.      int button;
  1484.      int tmp_setting;
  1485.      int prev_page;
  1486.  
  1487.      prev_page = tmp_setting = curr_page;
  1488.  
  1489.      set_int(ad_go_page,GOTOPAGE,curr_page);     
  1490.      button = execform(ad_go_page,GOTOPAGE);
  1491.      ad_go_page[button].ob_state = NORMAL;
  1492.      if(button == GOOK)
  1493.      {
  1494.      tmp_setting = get_int(ad_go_page,GOTOPAGE);
  1495.      if(tmp_setting > 999)
  1496.           curr_page = 999;
  1497.          else
  1498.          curr_page = ((tmp_setting < 0) ? (0):(tmp_setting));
  1499.      }
  1500.      set_int(ad_go_page,GOTOPAGE,curr_page);
  1501.  
  1502.      if(prev_page != curr_page)
  1503.      {
  1504.         mode_change = TRUE;
  1505.         force_preview();
  1506.      }
  1507.      do_pagenum(curr_page,(curr_page%2)?1:0);
  1508. }
  1509.  
  1510.  
  1511.  
  1512.  
  1513. /**************************************************************************/
  1514. /* Function:    do_font_info()                          */
  1515. /* Description: Get info from dialog boxes                  */
  1516. /**************************************************************************/
  1517. do_font_info(tree,index,fmax,fmin,value)
  1518. OBJECT *tree;
  1519. int index;
  1520. int fmax;
  1521. int fmin;
  1522. int *value;
  1523. {
  1524.     int tmp_setting;
  1525.  
  1526.     tmp_setting = get_int(tree,index);
  1527.     if(tmp_setting > fmax)
  1528.         *value = fmin;
  1529.     else
  1530.         *value = ((tmp_setting < fmin) ? (fmin): (tmp_setting));
  1531. }
  1532.  
  1533.  
  1534.  
  1535.  
  1536. /**************************************************************************/
  1537. /* Function:    get_image()                          */
  1538. /* Description:    Setup to load images dialog                  */
  1539. /**************************************************************************/
  1540. get_image()
  1541. {
  1542.     int button;
  1543.     register int i;
  1544.     int changed;
  1545.  
  1546.     button = execform(ad_get_image,0);
  1547.     ad_get_image[button].ob_state = NORMAL;
  1548.     for(i=INEO;i<=IPI1;i++)
  1549.     {
  1550.        if(ad_get_image[i].ob_state == SELECTED)
  1551.        {
  1552.       cur_pic_type = i - INEO;
  1553.           break;
  1554.        }
  1555.     }
  1556.     strcpy(pathbuf,dpath3);
  1557.     switch(cur_pic_type)
  1558.     {
  1559.        case 0:  strcat(pathbuf,"*.NEO");
  1560.         
  1561.         break;
  1562.  
  1563.        case 1:  strcat(pathbuf,"*.IMG");
  1564.         break;
  1565.  
  1566.        case 2:  strcat(pathbuf,"*.GEM");
  1567.         break;
  1568.  
  1569.        case 3:  strcat(pathbuf,"*.PI1");
  1570.         break;
  1571.     }
  1572.     if(!get_fs(fbuffer,&changed))
  1573.     {
  1574.                funcs = &nada;
  1575.            graf_mouse(ARROW,&dummy);
  1576.            return(0);
  1577.     }
  1578.  
  1579.     if(changed)                    /* If path changed */
  1580.     {
  1581.     alert_cntre(ALERT38);
  1582.     funcs = &nada;
  1583.     graf_mouse(ARROW,&dummy);
  1584.     return(0);
  1585.     }
  1586.  
  1587.     extender(fbuffer,gtype[cur_pic_type]);
  1588.     Fsetdta(&thedta.res[0]);
  1589.     if(Fsfirst(fbuffer,0) <= -1)
  1590.     {
  1591.         funcs = &nada;
  1592.         graf_mouse(ARROW,&dummy);
  1593.         alert_cntre(ALERT8);        
  1594.         return(0);
  1595.     }
  1596.     return(1);
  1597.           
  1598. }
  1599.  
  1600.  
  1601.  
  1602.  
  1603. /**************************************************************************/
  1604. /* Function:    update_point_dialog()                      */
  1605. /* Description:    Setup Font info                          */
  1606. /**************************************************************************/
  1607. update_point_dialog()
  1608. {
  1609.      int jtype;
  1610.  
  1611.      set_int(ad_point_size,FONTNUM,gltxtattr.font);
  1612.      to_mu_pt12(ad_point_size,gltxtattr.ssiz,SSETSIZE);
  1613.      to_mu_pt12(ad_point_size,gltxtattr.ptsz,FNTSIZE);
  1614.  
  1615.      jtype = unit_type;
  1616.      unit_type = 1;    /* points */     
  1617.      to_mu_vlrv(ad_point_size,(int)gltxtattr.lnsp,LINESPCE);
  1618.      unit_type = jtype;
  1619. }
  1620.  
  1621.  
  1622.  
  1623.  
  1624. /**************************************************************************/
  1625. /* Function: init_artobj()                          */
  1626. /* Description:    Initialize Article selector box                  */
  1627. /**************************************************************************/
  1628. init_artobj()
  1629. {
  1630.    int tot;
  1631.  
  1632.    tot = get_num_arts();
  1633.    init_slider(artobj,tot,DSLDER,DSLDBOX,&hslider,PAGESIZ);
  1634.    curfirst_art = 0;            /* Start with first article */
  1635.    set_artobj(curfirst_art);
  1636. }
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642. /**************************************************************************/
  1643. /* Function: deselect()                              */
  1644. /* Description: Deselect all objects of the Article tree          */
  1645. /**************************************************************************/
  1646. deselect()
  1647. {
  1648.    register int i;
  1649.  
  1650.    for(i = DART1;i <= DART8;i++)
  1651.    {
  1652.     if(artobj[i].ob_state == SELECTED)
  1653.     {
  1654.        objc_change(artobj,i,0,aworkx,aworky,aworkw,aworkh,
  1655.         NORMAL,1);
  1656.     }
  1657.    }
  1658. }
  1659.  
  1660.  
  1661.  
  1662.  
  1663. /**************************************************************************/
  1664. /* Function: init_slider()                          */
  1665. /* Description: Initialize the slider size in the Article box          */
  1666. /**************************************************************************/
  1667. init_slider(obj,tot_names,slider,sld_box,height,max)
  1668. OBJECT *obj;
  1669. int    tot_names,slider,sld_box;
  1670. int    *height;
  1671. int     max;
  1672. {
  1673.     register OBJECT    *sldobj;
  1674.     register OBJECT    *sldbxobj;
  1675.  
  1676.     sldobj = &obj[slider];        /* init slider object */
  1677.     sldbxobj = &obj[sld_box];    /* init slider object */
  1678.  
  1679.     sldobj->ob_y = 0;        /* init slider -top position */
  1680.                     /* set slider box size */
  1681.     if(tot_names <= max)
  1682.         sldobj->ob_height=sldbxobj->ob_height;
  1683.     else
  1684.         sldobj->ob_height=(sldbxobj->ob_height*max)/tot_names;
  1685.     *height = sldbxobj->ob_height - sldobj->ob_height;
  1686. }
  1687.  
  1688.  
  1689.  
  1690. /************************************************************************/
  1691. /* Function: get_num_arts()                        */
  1692. /* Description: Return number of articles in memory            */
  1693. /************************************************************************/
  1694. get_num_arts()
  1695. {
  1696.    register int count;
  1697.  
  1698.    if(!getf_article())
  1699.     return(0);
  1700.    count = 1;
  1701.    while(getn_article())
  1702.     count++;
  1703.    return(count);
  1704. }
  1705.  
  1706.  
  1707.  
  1708.  
  1709. /************************************************************************/
  1710. /* do_slider    Move the slider in the slider box to the correct    */
  1711. /*        position.                        */
  1712. /************************************************************************/
  1713. do_slider(obj,slider,sld_box,sld_height,tot_names,cur_name,max)
  1714. OBJECT    *obj;
  1715. int    slider;
  1716. int    sld_box;
  1717. register int    sld_height;
  1718. int    tot_names;
  1719. int    cur_name;
  1720. int     max;
  1721. {
  1722.    int    y;
  1723.    register OBJECT    *sldobj;
  1724.  
  1725.    sldobj = &obj[slider];               /* init slider object      */
  1726.    y = sldobj->ob_y;                      /* get current y position  */
  1727.    sldobj->ob_y =  (sld_height*cur_name)/(tot_names-max);
  1728.    if(sldobj->ob_y > sld_height)              /* keep in parent box      */
  1729.        sldobj->ob_y = sld_height;
  1730.    if(sldobj->ob_y != y)              /* If (different position) */
  1731.     objc_draw(obj,sld_box,1,aworkx,aworky,aworkw,aworkh);     /* draw it */
  1732. }
  1733.  
  1734.  
  1735.  
  1736. /**************************************************************************/
  1737. /* Function do_artobj()                              */
  1738. /* Description:                               */
  1739. /**************************************************************************/
  1740. long do_artobj()
  1741. {
  1742.    int x,y,w,h;
  1743.    register int obj;
  1744.    int cont;
  1745.    int okflag;
  1746.    int tmpxy[4];
  1747.    register long artptr;
  1748.    register int i;
  1749.    int found;
  1750.    char *str;
  1751.  
  1752.    vs_clip(shandle,0,tmpxy);
  1753.    init_artobj();
  1754.    form_center(artobj,&x,&y,&w,&h);
  1755.    form_dial(0,0,0,36,36,x,y,w,h);
  1756.    objc_draw(artobj,0,MAX_DEPTH,x,y,w,h);
  1757.  
  1758.    do
  1759.    {
  1760.      obj = form_do(artobj,0);
  1761.        obj &= 0x7fff;
  1762.      cont = hndl_abox(obj,&okflag);
  1763.    }while(cont);
  1764.    if(okflag)
  1765.    {
  1766.       artobj[DOK].ob_state = NORMAL;
  1767.       found = 0;
  1768.       for(i = DART1;i <= DART8;i++)
  1769.       {
  1770.      if(artobj[i].ob_state == SELECTED)
  1771.      {
  1772.         artobj[i].ob_state = NORMAL;
  1773.         found = 1;
  1774.         break;
  1775.      }
  1776.       }
  1777.       if(found)
  1778.       {
  1779.          artptr = getf_article();
  1780.      while(artptr)
  1781.      {
  1782.         str = get_artfname();
  1783.  
  1784.         if(!strcmp(str,artobj[i].ob_spec))
  1785.         break;
  1786.         artptr = getn_article();
  1787.      }
  1788.       }
  1789.       else        /* If not found */
  1790.     artptr = 0L;
  1791.    }
  1792.    else            /* If cancel selected */
  1793.    {
  1794.     artobj[DCANCEL].ob_state = NORMAL;
  1795.     artptr = 0L; 
  1796.    }
  1797.    form_dial(3,0,0,36,36,x,y,w,h);
  1798.    screen_clip();
  1799.    return artptr;
  1800. }
  1801.  
  1802.  
  1803.  
  1804.  
  1805. /************************************************************************/
  1806. /* get_artptr    Handle the article box                    */
  1807. /************************************************************************/
  1808. hndl_abox(obj,okflag)
  1809. int    obj;
  1810. int     *okflag;
  1811. {
  1812. int    mov_dir;
  1813. int    x_box,y_box;
  1814. int    value;
  1815. int    num;
  1816. register OBJECT    *slider;
  1817. register OBJECT    *slidbox;
  1818. int     cont;
  1819. int     mx,my;
  1820. int    dummy;
  1821.  
  1822.    *okflag = 1;
  1823.    cont = 1;
  1824.    num = get_num_arts();
  1825.    slider = &artobj[DSLDER];
  1826.    slidbox = &artobj[DSLDBOX];
  1827.    switch(obj)
  1828.    {
  1829.     case    DDOWN:
  1830.        if(slider->ob_y == slidbox->ob_height-hslider) 
  1831.         break;
  1832.        hndl_list(curfirst_art,1);
  1833.        break;
  1834.     case    DUP:
  1835.        if(!slider->ob_y) 
  1836.         break;
  1837.        hndl_list(curfirst_art,-1);
  1838.        break;
  1839.     case    DSLDBOX:
  1840.        graf_mkstate(&mx,&my,&dummy,&dummy);
  1841.        objc_offset(artobj,DSLDBOX,&x_box,&y_box);
  1842.        if(my > y_box+slider->ob_y) 
  1843.         mov_dir = PAGESIZ;
  1844.        else    
  1845.         mov_dir = -PAGESIZ;
  1846.        hndl_list(curfirst_art,mov_dir);
  1847.        break;
  1848.     case    DSLDER:
  1849.        value = graf_slidebox(artobj,DSLDBOX,DSLDER);
  1850.        value = scale_v(value,num-PAGESIZ,1000);
  1851.        hndl_list(value,0);
  1852.        break;
  1853.     case    DART1:
  1854.     case    DART2:
  1855.     case    DART3:
  1856.     case    DART4:
  1857.     case    DART5:
  1858.     case    DART6:
  1859.     case    DART7:
  1860.     case    DART8:
  1861.            break;
  1862.     case    DOK:
  1863.        cont = 0;
  1864.        *okflag = 1;
  1865.        break;
  1866.     case     DCANCEL:
  1867.        cont = 0;
  1868.        *okflag = 0;
  1869.     default:
  1870.            break;
  1871.    } /* end switch */
  1872.  
  1873.    return(cont);
  1874. }
  1875.  
  1876.  
  1877.  
  1878.  
  1879.  
  1880. /************************************************************************/
  1881. /* hndl_list    Routine to handle the font selection list.        */
  1882. /************************************************************************/
  1883. hndl_list(begname,movdir)
  1884. int    begname;
  1885. int    movdir;
  1886. {
  1887.    int    tot;
  1888.  
  1889.    tot =  get_num_arts();
  1890.    gsx_moff();            /* remove the rat */
  1891.    deselect();            /* deselect names */
  1892.    curfirst_art = scroll(tot,begname,movdir);
  1893.    do_slider(artobj,DSLDER,DSLDBOX,hslider,tot,curfirst_art,PAGESIZ);
  1894.    gsx_mon();    
  1895. }
  1896.  
  1897.  
  1898.  
  1899.  
  1900. /************************************************************************/
  1901. /* scroll    Given a pointer to a device block the starting font in  */
  1902. /* the font list, and the amt to scroll(1,-1,PAGESIZ,-PAGESIZ). Returns */
  1903. /* the object number of the top displayed object.                */
  1904. /************************************************************************/
  1905. scroll(total_names,startname,amount)
  1906. int    total_names;
  1907. int    startname;        /* starting font in linked list */
  1908. int    amount;            /* amount to move by */
  1909. {
  1910.    register int    i,j;
  1911.    int    textobj,x,y;
  1912.    long scrmfdb;
  1913.  
  1914.    scrmfdb = 0L;
  1915.  
  1916.    i = startname+amount;
  1917.    j = total_names-PAGESIZ;
  1918.  
  1919.    if(i<0 || j<0) 
  1920.     i = 0;
  1921.    if(j<0) 
  1922.     j=0;
  1923.    if(i>j) 
  1924.         i = j;
  1925.  
  1926.  
  1927.    set_artobj(i);
  1928.  
  1929.    if(amount != -1 && amount != 1) 
  1930.    {                     /* do page scrolling (objc_draw) */
  1931.     objc_draw(artobj,DARTROOT,1,aworkx,aworky,aworkw,aworkh);
  1932.     return(i);
  1933.    }
  1934.    if(i==startname)
  1935.      return(i);            /* reject unnecessary single scroll */
  1936.  
  1937.                     /* else we do single line scroll */
  1938.  
  1939.    objc_offset(artobj,DART1,&x,&y);
  1940.  
  1941.    ptsin[0] = x;                /* init clipping x,y,w,h */
  1942.    ptsin[1] = y;
  1943.    ptsin[2] = x+artobj[DART1].ob_width;
  1944.    ptsin[3] = y+gl_hchar*PAGESIZ-1;
  1945.  
  1946.    ptsin[4] = x;                /* init blit destination */
  1947.    ptsin[5] = y;
  1948.    ptsin[6] = ptsin[2];
  1949.    ptsin[7] = ptsin[3];
  1950.  
  1951.    vs_clip(shandle,1,ptsin);
  1952.  
  1953.    if(amount < 0) 
  1954.    {                        /* if (-) going up */
  1955.     ptsin[1] -= gl_hchar;        /* src y */
  1956.     ptsin[3] += gl_hchar;        /* src h */
  1957.     ptsin[7] += gl_hchar;
  1958.     textobj = artobj[DARTROOT].ob_head;
  1959.    }
  1960.    else 
  1961.    {                        /* going down */
  1962.     ptsin[3] += gl_hchar;
  1963.     ptsin[5] -= gl_hchar;
  1964.     ptsin[7] -= gl_hchar;
  1965.     textobj = artobj[DARTROOT].ob_tail;
  1966.    }
  1967.    gsx_moff();
  1968.    vro_cpyfm(shandle,3,ptsin,&scrmfdb,&scrmfdb);
  1969.    objc_draw(artobj,textobj,0,aworkx,aworky,aworkw,aworkh);
  1970.    gsx_mon();
  1971.    return(i);
  1972. }
  1973.  
  1974.  
  1975.  
  1976.  
  1977. /************************************************************************/
  1978. /* set_artobj    Set the objects string pointers in the artobj to the    */
  1979. /*        article names found in article linked list. Starting    */
  1980. /*        at the curr_index articles and continuing until        */
  1981. /*        PAGESIZ are done or no more.                  */
  1982. /************************************************************************/
  1983. set_artobj(nameindex)
  1984. register int    nameindex;
  1985. {
  1986.    int    flag;
  1987.    register OBJECT *curobj;
  1988.    register int i;
  1989.    int obj;
  1990.    register long artnames;
  1991.    char *fname;
  1992.  
  1993.    flag = SELECTABLE|RBUTTON;            /* if displayed fonts */
  1994.                         /* get to current index */
  1995.    artnames = getf_article();
  1996.    if(artnames)
  1997.    {
  1998.     while(nameindex-- && artnames)
  1999.        artnames = getn_article();
  2000.    }
  2001.    i  = PAGESIZ-1;
  2002.    obj = DART1;
  2003.    do 
  2004.    {
  2005.     curobj = &artobj[obj];              /* current GSTRING   */
  2006.     if(!artnames) 
  2007.     {                      /* if no font        */
  2008.        curobj->ob_spec = tmpflname;       /* use template      */
  2009.            curobj->ob_flags = NONE;
  2010.     }
  2011.     else 
  2012.     {
  2013.        fname = get_artfname();
  2014.        curobj->ob_spec = fname;               /* or filename       */
  2015.        curobj->ob_flags = flag;           /* set proper flags  */
  2016.        artnames = getn_article();
  2017.     }
  2018.     obj = curobj->ob_next;                 /* next object index */
  2019.  
  2020.    } while(i--);
  2021. }
  2022.  
  2023.  
  2024.  
  2025.  
  2026.  
  2027. /**************************************************************************/
  2028. /* Function: do_unit_dialog()                          */
  2029. /* Description: handle changing units of measure              */
  2030. /**************************************************************************/
  2031. do_unit_dialog()
  2032. {
  2033.    int button;
  2034.    register int i;
  2035.    register int *hval,*vval;
  2036.    int titem;
  2037.  
  2038.    unitobj[MINCHES+unit_type].ob_state = SELECTED;
  2039.    button = execform(unitobj,0);
  2040.    unitobj[button].ob_state = NORMAL;
  2041.    if(button == MOK)
  2042.    {
  2043.     for(i = MINCHES;i <= MCICERO;i++)
  2044.     {
  2045.        if(unitobj[i].ob_state == SELECTED)
  2046.        {
  2047.         unitobj[i].ob_state = NORMAL;
  2048.         unit_type = i - MINCHES;
  2049.        }
  2050.         }
  2051.  
  2052.            switch(unit_type)
  2053.            {
  2054.                 case 0:   hval = hinch_mus;
  2055.             vval = vinch_mus; 
  2056.              break;
  2057.  
  2058.                 case 1:    hval = hpica_mus;
  2059.             vval = vpica_mus;
  2060.             break;
  2061.  
  2062.           case 2:    hval = hcent_mus;
  2063.             vval = vcent_mus;
  2064.             break;
  2065.  
  2066.                 case 3:    hval = hcicero_mus;
  2067.             vval = vcicero_mus;
  2068.             break;
  2069.            }
  2070.  
  2071.  
  2072.         for(i = GRBUT1;i <= GRBUT4;i++)
  2073.             {
  2074.            if(gridspace[i].ob_state == SELECTED)
  2075.            {
  2076.          hgridspace = hval[i - GRBUT1];
  2077.          vgridspace = vval[i - GRBUT1];
  2078.            }
  2079.         }
  2080.             if(view_size != PADJCNT)
  2081.         titem = view_size;
  2082.               else
  2083.                 titem = ((curr_page % 2)?(view_size + 1):(view_size));        
  2084.               wind_set(prev_handle,WF_INFO,winfo[titem - PSIZE][unit_type]);
  2085.         return(1);    
  2086.    }
  2087.    else
  2088.    {
  2089.     for(i=MINCHES;i<=MCICERO;i++)
  2090.         unitobj[i].ob_state = NORMAL;
  2091.     unitobj[MINCHES+unit_type].ob_state = SELECTED;
  2092.     return(0);
  2093.    }
  2094. }
  2095.  
  2096.  
  2097.  
  2098.  
  2099.  
  2100. /**************************************************************************/
  2101. /* Function: do_grid_space()                          */
  2102. /* Description: select grid spacing dialog                  */
  2103. /**************************************************************************/
  2104. do_grid_space()
  2105. {
  2106.    int button;
  2107.    register int i;
  2108.    int oldsp;
  2109.    register char **str;
  2110.    register int *hval;
  2111.    register int *vval;
  2112.    
  2113.    switch(unit_type)
  2114.    {
  2115.       case 0:   str = grid_inch;
  2116.         hval = hinch_mus;
  2117.         vval = vinch_mus; 
  2118.          break;
  2119.       case 1:   str = grid_picas;
  2120.         hval = hpica_mus;
  2121.         vval = vpica_mus;
  2122.         break;
  2123.       case 2:   str = grid_cents;
  2124.         hval = hcent_mus;
  2125.         vval = vcent_mus;
  2126.         break;
  2127.       case 3:   str = grid_cicero;
  2128.         hval = hcicero_mus;
  2129.         vval = vcicero_mus;
  2130.    }
  2131.    for(i = GRBUT1;i <= GRBUT4;i++)
  2132.    {
  2133.       gridspace[i].ob_spec = str[i - GRBUT1];
  2134.       if(gridspace[i].ob_state == SELECTED)
  2135.       {
  2136.     oldsp = i;
  2137.       }
  2138.    }
  2139.    button = execform(gridspace,0);
  2140.    if(button == GRIDOK)
  2141.    {
  2142.     gridspace[GRIDOK].ob_state = NORMAL;
  2143.     for(i = GRBUT1;i <= GRBUT4;i++)
  2144.         {
  2145.        if(gridspace[i].ob_state == SELECTED)
  2146.        {
  2147.         hgridspace = hval[i - GRBUT1];
  2148.         vgridspace = vval[i - GRBUT1];
  2149.        }
  2150.     }
  2151.     return(1);
  2152.    }
  2153.    else
  2154.    {
  2155.     for(i = GRBUT1;i <= GRBUT4;i++)
  2156.         {
  2157.        gridspace[i].ob_state = NORMAL;
  2158.     }
  2159.         gridspace[oldsp].ob_state = SELECTED;
  2160.     gridspace[GRIDCAN].ob_state = NORMAL;
  2161.     return(0);
  2162.    }
  2163.    
  2164. }
  2165.     
  2166.  
  2167.  
  2168.  
  2169.  
  2170. /**************************************************************************/
  2171. /* Function: do_page_def()                          */
  2172. /* Description: Page Type Selection Dialog                  */
  2173. /**************************************************************************/
  2174. do_page_def()
  2175. {
  2176.    int button;
  2177.    register int i;
  2178.    int pagetmp;
  2179.  
  2180.    for(i=PA4;i<=PLEGAL;i++)
  2181.     adpagedef[i].ob_state = NORMAL;
  2182.    adpagedef[PPORT].ob_state = NORMAL;
  2183.    adpagedef[PLAND].ob_state = NORMAL;
  2184.  
  2185.    if(pagetype > PLEGAL)
  2186.    {
  2187.     adpagedef[PLAND].ob_state = SELECTED;        /* offset by 4    */
  2188.     adpagedef[pagetype - 4].ob_state = SELECTED;    /* for index      */
  2189.    }
  2190.    else
  2191.    {
  2192.      adpagedef[PPORT].ob_state = SELECTED;
  2193.      adpagedef[pagetype].ob_state  = SELECTED;
  2194.    }
  2195.    pagetmp = pagetype;
  2196.  
  2197.    button = execform(adpagedef,0);
  2198.    adpagedef[button].ob_state = NORMAL;
  2199.    if(button == PSIZEOK)
  2200.    {
  2201.     for(i=PA4;i<=PLEGAL;i++)
  2202.     {
  2203.        if(adpagedef[i].ob_state == SELECTED)
  2204.        {
  2205.         pagetype = i;
  2206.         if(adpagedef[PLAND].ob_state == SELECTED)
  2207.                 pagetype += 4;            /* offset to landscape*/
  2208.             if(pagetype == PLEGAL + 4)
  2209.         {
  2210.            if((view_size == PADJCNT) || (view_size == P200))
  2211.                             goto cancel;
  2212.            menu_ienable(ad_menu,PADJCNT,FALSE);
  2213.            menu_ienable(ad_menu,P200,FALSE);
  2214.             }
  2215.                 else
  2216.                 {
  2217.            menu_ienable(ad_menu,PADJCNT,TRUE);
  2218.            menu_ienable(ad_menu,P200,TRUE);
  2219.                 }
  2220.         hpage_size = pagemux[pagetype - PA4];
  2221.         vpage_size = pagemuy[pagetype - PA4];
  2222.         mutomem(hpage_size,vpage_size,&scan_xres,&scan_yres);
  2223.               page_area.g_x = page_area.g_y = 0L;
  2224.                 gsx_moff();
  2225.                 vsf_interior(shandle,0);            /* Set to Solid   */
  2226.               if((view_size == PSIZE) ||
  2227.            (view_size == PADJCNT))
  2228.              pdraw_fit(view_size);
  2229.               else
  2230.              pdraw_scale();
  2231.               zoom_setup();
  2232.               cur_scale = get_scale_num(view_size);
  2233.               get_work(prev_handle);
  2234.               update_preview_blit();
  2235.               set_clip(TRUE,&pwork);
  2236.               vr_recfl(shandle,pxy);
  2237.               set_clip(FALSE,&pwork);
  2238.               gsx_mon();
  2239.               clear_window(prev_handle,2,1);
  2240.               set_clip(TRUE,&pwork);
  2241.               init_rulers();
  2242.               force_preview();
  2243.               slider_chk();
  2244.               set_clip(TRUE,&dpwork);
  2245.        }
  2246.     }
  2247.    }
  2248.    else
  2249.    {
  2250. cancel:
  2251.     pagetype = pagetmp;
  2252.     for(i=PA4;i<=PLEGAL;i++)
  2253.         adpagedef[i].ob_state = NORMAL;
  2254.     adpagedef[PPORT].ob_state = NORMAL;
  2255.     adpagedef[PLAND].ob_state = NORMAL;
  2256.  
  2257.         if(pagetype > PLEGAL)
  2258.     {
  2259.        adpagedef[pagetype-4].ob_state  = SELECTED;
  2260.        adpagedef[PLEGAL].ob_state = SELECTED;
  2261.     }
  2262.     else
  2263.     {
  2264.        adpagedef[pagetype].ob_state  = SELECTED;
  2265.        adpagedef[PPORT].ob_state = SELECTED;
  2266.     }
  2267.    }
  2268. }
  2269.  
  2270.  
  2271.  
  2272.  
  2273.  
  2274. /**************************************************************************/
  2275. /* Function: do_clip_dialog()                          */
  2276. /* Description: clip board dialog box...                  */
  2277. /**************************************************************************/
  2278. do_clip_dialog()
  2279. {
  2280.    int button;
  2281.    int fromval,toval;
  2282.    register int i;
  2283.  
  2284.    set_int(adclipobj,CLFROM,curr_page);
  2285.    set_int(adclipobj,CLTO,curr_page);
  2286.  
  2287.    button = execform(adclipobj,CLTO);
  2288.    if(button == CLOK)
  2289.    {
  2290.       adclipobj[CLOK].ob_state = NORMAL;
  2291.       fromval = get_int(adclipobj,CLFROM);
  2292.       toval   = get_int(adclipobj,CLTO);
  2293.       if(toval < fromval)
  2294.      toval = fromval;
  2295.       if(adclipobj[CLCUR].ob_state == SELECTED)
  2296.       {            
  2297.          clip_to_page(curr_page);
  2298.       }
  2299.       else if(adclipobj[CLALL].ob_state == SELECTED)
  2300.       {
  2301.      for(i = fromval; i <= toval;i++)
  2302.      {
  2303.         if(!clip_to_page(i))
  2304.         break;
  2305.      }
  2306.       }
  2307.       else if(adclipobj[CLEVEN].ob_state == SELECTED)
  2308.       {
  2309.      for(i = fromval; i <= toval;i++)
  2310.      {
  2311.         if(!(i & 1))        /* Only even numbers */
  2312.         {
  2313.         if(!clip_to_page(i))
  2314.            break;
  2315.         }
  2316.      }
  2317.       }
  2318.       else 
  2319.       {
  2320.     for(i = fromval; i <= toval; i++)
  2321.     {
  2322.        if(i & 1)
  2323.        {
  2324.         if(!clip_to_page(i))
  2325.            break;
  2326.        }
  2327.     }
  2328.       }
  2329.       force_draw_flag = TRUE;
  2330.       force_preview();
  2331.       menu_ienable(ad_menu,ACREATE,1);
  2332.    }
  2333.    else
  2334.     adclipobj[CLCANCEL].ob_state = NORMAL;
  2335. }
  2336.  
  2337.  
  2338.  
  2339.  
  2340.  
  2341. /**************************************************************************/
  2342. /* Function: do_rcoord()                          */
  2343. /* Description: Handle typed in coordinates of regions              */
  2344. /**************************************************************************/
  2345. do_rcoord()
  2346. {
  2347.      int button;
  2348.      long *str1;
  2349.      int  page;
  2350.      int  type;
  2351.      int  bx1,by1,bx2,by2;
  2352.      int  cx1,cy1,cx2,cy2;
  2353.      int  sobj;
  2354.      int  x,y,w,h;
  2355.  
  2356.    if(region_ptr)
  2357.    {
  2358.      check_top_window();
  2359.      find_boundary(region_ptr,&bx1,&by1,&bx2,&by2,&type,&page);
  2360.  
  2361.  
  2362.      int_mu_hlrv(ad_rcoord,bx1,RUPLEFT);
  2363.      int_mu_vlrv(ad_rcoord,by1,RUPRIGHT);
  2364.      int_mu_hlrv(ad_rcoord,bx2-bx1,REGWIDTH);
  2365.      int_mu_vlrv(ad_rcoord,by2-by1,RHEIGHT);
  2366.  
  2367.      str1 = ad_rcoord[REGUNITS].ob_spec;
  2368.      strcpy(*str1,rcoord_unit[unit_type]);
  2369.      form_center(ad_rcoord,&x,&y,&w,&h);
  2370.      form_dial(0,0,0,36,36,x,y,w,h);
  2371.      objc_draw(ad_rcoord,0,MAX_DEPTH,x,y,w,h);
  2372.  
  2373.      sobj = RUPLEFT;     
  2374.  
  2375. err:
  2376.      button = form_do(ad_rcoord,sobj);
  2377.  
  2378.      ad_rcoord[button].ob_state = NORMAL;
  2379.      if(button == ROK)
  2380.      {
  2381.  
  2382.         if(!parmcheck(ad_rcoord,RUPLEFT,1,1))   /* Upper left */
  2383.         {
  2384.       cx1 = Pval;
  2385.           if(!parmcheck(ad_rcoord,RUPRIGHT,3,1))/* upper right*/
  2386.       {
  2387.         cy1 = Pval;
  2388.             if(!parmcheck(ad_rcoord,REGWIDTH,1,1))/* lower left */
  2389.         {
  2390.           cx2 = Pval;
  2391.               if(!parmcheck(ad_rcoord,RHEIGHT,3,1))/* lower right*/
  2392.           {
  2393.             cy2 = Pval; 
  2394.             do_trans_scale(bx1,by1,bx2-bx1,by2-by1,
  2395.                cx1,cy1,cx2,cy2,type);
  2396.           }
  2397.           else
  2398.           {
  2399.                objc_draw(ad_rcoord,button,1,x,y,w,h);
  2400.         sobj = RHEIGHT;
  2401.         goto err;
  2402.           }
  2403.         }
  2404.         else
  2405.         {
  2406.                objc_draw(ad_rcoord,button,1,x,y,w,h);
  2407.         sobj = REGWIDTH;
  2408.         goto err;
  2409.         }
  2410.       }
  2411.       else
  2412.       {
  2413.               objc_draw(ad_rcoord,button,1,x,y,w,h);
  2414.          sobj = RUPRIGHT;
  2415.          goto err;
  2416.       }
  2417.         }      /*if(!parmcheck(ad_pcoord,PUPLEFT,1))*/
  2418.     else
  2419.     {
  2420.            objc_draw(ad_rcoord,button,1,x,y,w,h);
  2421.        sobj = RUPLEFT;
  2422.        goto err;
  2423.     }
  2424.      }
  2425.    }
  2426.    form_dial(3,0,0,3,36,x,y,w,h);
  2427.    clear_regprim_flags();
  2428.    do_blit();
  2429. }
  2430.  
  2431.  
  2432.  
  2433. /**************************************************************************/
  2434. /* Function: do_set_paths()                          */
  2435. /* Description: Handle Default Path dialog box                  */
  2436. /**************************************************************************/
  2437. do_set_paths()
  2438. {
  2439.    int button;
  2440.  
  2441.    button = execform(ad_paths,PATHTEXT);
  2442.    ad_paths[button].ob_state = NORMAL;
  2443.    
  2444.    if(button == PATHOK)                /* save paths */
  2445.    {
  2446.       dpath1 = get_edit(ad_paths,PATHTEXT);
  2447.       dpath2 = get_edit(ad_paths,PATHCLIP);
  2448.       dpath3 = get_edit(ad_paths,PATHGRAP);
  2449.       dpath4 = get_edit(ad_paths,PATHDOC);    
  2450.  
  2451.       write_paths(dpath1,dpath2,dpath3,dpath4);
  2452.    }
  2453.    else                        /* restore    */
  2454.    {
  2455.       restore_paths(dpath1,dpath2,dpath3,dpath4);
  2456.       set_tedit(ad_paths,PATHTEXT,dpath1);
  2457.       set_tedit(ad_paths,PATHCLIP,dpath2);
  2458.       set_tedit(ad_paths,PATHGRAP,dpath3);
  2459.       set_tedit(ad_paths,PATHDOC,dpath4);    
  2460.    }
  2461. }
  2462.  
  2463.  
  2464.  
  2465. /**************************************************************************/
  2466. /* Function: set_tedit()                          */
  2467. /* Description: Insert Text into Text Dialog Field              */
  2468. /**************************************************************************/
  2469. set_tedit(tree,object,str)
  2470. OBJECT *tree;
  2471. int object;
  2472. char *str;
  2473. {
  2474.     long *str1;
  2475.  
  2476.      str1 = tree[object].ob_spec;
  2477.      strcpy(*str1,str);
  2478. }
  2479.  
  2480.  
  2481. /**************************************************************************/
  2482. /* Function: get_edit()                              */
  2483. /* Description: Get text from Editable Text Dialog Field          */
  2484. /**************************************************************************/
  2485. char *get_edit(tree,obj)
  2486. OBJECT *tree;
  2487. int obj;
  2488. {
  2489.     long *str1;
  2490.  
  2491.     str1 = tree[obj].ob_spec;
  2492.     return(*str1);
  2493. }
  2494.  
  2495.  
  2496.  
  2497.  
  2498. /**************************************************************************/
  2499. /* Function: do_pcoord()                          */
  2500. /* Description: Handle primitive type in coordinates dialog box          */
  2501. /**************************************************************************/
  2502. do_pcoord()
  2503. {
  2504.      int button;
  2505.      long *str1;
  2506.      int  type;
  2507.      int  bx1,by1,bx2,by2;
  2508.      int  cx1,cy1,cx2,cy2;
  2509.      int opcode,pcount;
  2510.      unsigned long rptr;
  2511.      int sobj;
  2512.      int x,y,w,h;
  2513.  
  2514.      if(!region_ptr)
  2515.      {
  2516.     clear_regprim_flags();        /* if no region, ergo, no prim  */
  2517.     do_blit();
  2518.     return;                /* ergo, clean up and return    */
  2519.      }
  2520.  
  2521.      rptr = get_curreg(&type);  
  2522.      opcode = get_cur_prim(&pcount,&wmode,&prim_ptr);
  2523.  
  2524.      if(prim_ptr)
  2525.      {
  2526.        calc_prim(opcode,&bx1,&by1,&bx2,&by2,pcount);
  2527.        check_top_window();
  2528.  
  2529.  
  2530.        int_mu_hlrv(ad_pcoord,bx1,PUPLEFT);
  2531.        int_mu_vlrv(ad_pcoord,by1,PUPRIGHT);
  2532.        int_mu_hlrv(ad_pcoord,bx2-bx1,PWIDTH);
  2533.        int_mu_vlrv(ad_pcoord,by2-by1,PHEIGHT);
  2534.  
  2535.        str1 = ad_pcoord[PRIMUNIT].ob_spec;
  2536.        strcpy(*str1,rcoord_unit[unit_type]);
  2537.  
  2538.  
  2539.      sobj = PUPLEFT;
  2540.      form_center(ad_pcoord,&x,&y,&w,&h);
  2541.      form_dial(0,0,0,36,36,x,y,w,h);
  2542.      objc_draw(ad_pcoord,0,MAX_DEPTH,x,y,w,h);
  2543.  
  2544. err:
  2545.        button = form_do(ad_pcoord,sobj);
  2546.  
  2547.        ad_pcoord[button].ob_state = NORMAL;
  2548.  
  2549.        if(button == POK)
  2550.        {
  2551.       if(!parmcheck(ad_pcoord,PUPLEFT,1,1))
  2552.           {
  2553.         cx1 = Pval;
  2554.  
  2555.         if(!parmcheck(ad_pcoord,PUPRIGHT,3,1))
  2556.         {
  2557.           cy1 = Pval;
  2558.           if(!parmcheck(ad_pcoord,PWIDTH,1,1))
  2559.           {
  2560.             cx2 = Pval;
  2561.             if(!parmcheck(ad_pcoord,PHEIGHT,3,1))
  2562.         {
  2563.             cy2 = Pval;
  2564.  
  2565.             scale_prim_coord(opcode,bx1,by1,bx2-bx1,by2-by1,
  2566.                      cx1,cy1,cx2,cy2,type,pcount,wmode);
  2567.         }
  2568.         else
  2569.         {
  2570.                   objc_draw(ad_pcoord,button,1,x,y,w,h);
  2571.           sobj = PHEIGHT;
  2572.           goto err;
  2573.         }
  2574.           }
  2575.           else
  2576.           {
  2577.                 objc_draw(ad_pcoord,button,1,x,y,w,h);
  2578.         sobj = PWIDTH;
  2579.         goto err;
  2580.           }
  2581.         }
  2582.         else
  2583.         {
  2584.               objc_draw(ad_pcoord,button,1,x,y,w,h);
  2585.           sobj = PUPRIGHT;
  2586.           goto err;
  2587.         }
  2588.           }      /*if(!parmcheck(ad_pcoord,PUPLEFT,1))  */
  2589.       else
  2590.       {
  2591.             objc_draw(ad_pcoord,button,1,x,y,w,h);
  2592.         sobj = PUPLEFT;
  2593.         goto err;
  2594.       }
  2595.        }
  2596.      }
  2597.      form_dial(3,0,0,3,36,x,y,w,h);
  2598.      clear_regprim_flags();
  2599.      do_blit();                /* always clear primitives and regions*/
  2600.                     /* and screen of markings after this  */
  2601. }
  2602.  
  2603.  
  2604.  
  2605.  
  2606. /**************************************************************************/
  2607. /* Function: set_template()                          */
  2608. /* Description: Set template usage dialog box                  */
  2609. /**************************************************************************/
  2610. set_template()
  2611. {
  2612.    register int i;
  2613.    int button;
  2614.  
  2615.    for(i=SETTBOTH;i<=SETTRITE;i++)
  2616.     ad_settmpl[i].ob_state = NORMAL;
  2617.    ad_settmpl[disp_type + SETTBOTH].ob_state = SELECTED;
  2618.  
  2619.    ad_settmpl[SETTFRNT].ob_state = NORMAL;
  2620.    ad_settmpl[SETTBACK].ob_state = NORMAL;
  2621.  
  2622.    if(disp_pos)
  2623.     ad_settmpl[SETTBACK].ob_state = SELECTED;
  2624.    else
  2625.     ad_settmpl[SETTFRNT].ob_state = SELECTED;
  2626.    
  2627.    button = execform(ad_settmpl,0);
  2628.    ad_settmpl[button].ob_state = NORMAL;
  2629.    
  2630.    if(button == SETTOK)
  2631.    {
  2632.      for(i=SETTBOTH;i<=SETTRITE;i++)
  2633.      {
  2634.       if(ad_settmpl[i].ob_state == SELECTED)
  2635.             disp_type = i - SETTBOTH;
  2636.      }
  2637.                         /* 0 = front 1 = back */
  2638.      disp_pos=((ad_settmpl[SETTFRNT].ob_state==SELECTED)?(0):(1));
  2639.      force_preview();
  2640.    }
  2641. }
  2642.  
  2643.  
  2644.  
  2645. /**************************************************************************/
  2646. /* Function: page_numbering()                          */
  2647. /* Description: Handle page numbering dialog box              */
  2648. /**************************************************************************/
  2649. page_numbering()
  2650. {
  2651.     int button;
  2652.     long *str1;
  2653.     long *str3;
  2654.     long *str4;
  2655.     long *str5;
  2656.     long str2;
  2657.     int fnt;
  2658.     int ptsize;
  2659.     int setsize;
  2660.     int pxy[4];
  2661.     int x,y,w,h;
  2662.     int x1,y1;
  2663.     int curvpos;
  2664.     int curdflag;
  2665.     char text[PTEXTMAX];    
  2666.     register int i;
  2667.     int lcurjust;
  2668.     int rcurjust;
  2669.     int curusage;
  2670.     register int findex;
  2671.     int *fntptr;
  2672.     int found;
  2673.     int fpage,tpage;
  2674.     int minpage,maxpage;
  2675.     int tmppage;
  2676.     int sobj;
  2677.  
  2678.     fnt = pnum.pfnum;
  2679.     ptsize = pnum.pptsize;;
  2680.     setsize = pnum.pstsize;
  2681.     curvpos = pnum.vpos;
  2682.     curdflag = pnum.display;
  2683.     strcpy(text,pnum.text);
  2684.     lcurjust = pnum.ljust;
  2685.     rcurjust = pnum.rjust;
  2686.     curusage = pnum.usage;
  2687.     fpage = pnum.fpage;
  2688.     tpage = pnum.tpage;
  2689.  
  2690.     maxpage = minpage = 0;    
  2691.     if(get_fpage(&minpage))
  2692.     {
  2693.      do
  2694.      {
  2695.     maxpage = tmppage;
  2696.      }while(get_npage(&tmppage));
  2697.     }
  2698.      
  2699.      fpage = max(fpage,minpage);
  2700.      tpage = min(tpage,maxpage);
  2701.      if(tpage < fpage)
  2702.         tpage = fpage;
  2703.  
  2704.     set_int(ad_pagenum,PNUMFROM,fpage);
  2705.     set_int(ad_pagenum,PNUMTO,tpage);
  2706.  
  2707.     /* to display or not */
  2708.     ad_pagenum[PDISPNUM].ob_state = ((curdflag)?(CHECKED):(NORMAL));
  2709.  
  2710.  
  2711.     findex = found = 0;
  2712.     for(findex = 0;findex < 16;findex++)
  2713.     {
  2714.     fntptr = ftlib + (findex*SFTSIZ);
  2715.     if(fnt == *fntptr)
  2716.     {
  2717.       found = 1;
  2718.       break;
  2719.     }
  2720.     }
  2721.     if(!found)
  2722.        findex = 0;
  2723.  
  2724.     str1 = ad_pagenum[PFNAME].ob_spec;        /* Font name and number*/
  2725.     str2 = ftlib + ((findex * SFTSIZ)+TFNOFS);
  2726.     strcpy(*str1,str2);
  2727.  
  2728.     set_int(ad_pagenum,PFNUM,*fntptr);
  2729.  
  2730.     to_mu_pt12(ad_pagenum,ptsize,PPOINTS);   /* Point size*/
  2731.     to_mu_pt12(ad_pagenum,setsize,PSETSIZE); /* Set size  */
  2732.  
  2733.     str3 = ad_pagenum[PAGEUNIT].ob_spec;    /* units - inches etc...*/
  2734.     strcpy(*str3,rcoord_unit[unit_type]);
  2735.  
  2736.     str4 = ad_pagenum[PTDIST].ob_spec;        /* Text for distance    */
  2737.     strcpy(*str4,dpagenum[curvpos]);
  2738.  
  2739.     str5 = ad_pagenum[PSTRING].ob_spec;
  2740.     strcpy(*str5,text);
  2741.  
  2742.  
  2743.     to_mu_vlrv(ad_pagenum,pnum.distance,PDIST);
  2744.  
  2745.     for(i=PLJLEFT;i<=PLJRIGHT;i++)
  2746.     {
  2747.        ad_pagenum[i].ob_state = NORMAL;
  2748.     }
  2749.     ad_pagenum[lcurjust + PLJLEFT].ob_state = SELECTED;
  2750.  
  2751.  
  2752.     for(i=PRJLEFT;i<=PRJRIGHT;i++)
  2753.     {
  2754.        ad_pagenum[i].ob_state = NORMAL;
  2755.     }
  2756.     ad_pagenum[rcurjust + PRJLEFT].ob_state = SELECTED;
  2757.  
  2758.  
  2759.     for(i=PLEFT;i<=PBOTH;i++)
  2760.     {
  2761.     ad_pagenum[i].ob_state = NORMAL;
  2762.     }
  2763.     ad_pagenum[curusage + PLEFT].ob_state = SELECTED;
  2764.  
  2765.     for(i=PTOP;i<=PBOTTOM;i++)
  2766.     {
  2767.     ad_pagenum[i].ob_state = NORMAL;
  2768.     }
  2769.     ad_pagenum[curvpos + PTOP].ob_state = SELECTED;
  2770.  
  2771.     form_center(ad_pagenum,&x,&y,&w,&h);
  2772.     form_dial(0,0,0,36,36,x,y,w,h);
  2773.     objc_draw(ad_pagenum,0,MAX_DEPTH,x,y,w,h);
  2774.     objc_offset(ad_pagenum,PFNAME,&x1,&y1);
  2775.     pxy[0] = x1;
  2776.     pxy[1] = y1;
  2777.     pxy[2] = x1 + ad_pagenum[PFNAME].ob_width - 1;
  2778.     pxy[3] = y1 + ad_pagenum[PFNAME].ob_height - 1;
  2779.     vsf_interior(shandle,0);
  2780.  
  2781.     sobj = PFNUM;
  2782. err:do
  2783.     {
  2784.       button = form_do(ad_pagenum,sobj);
  2785.       button &= 0x7fff;
  2786.       switch(button)
  2787.       {
  2788.     case PLARROW:
  2789.     case PRARROW:
  2790.              findex = ((button==PRARROW)?(findex + 1):(findex-1));
  2791.              if(findex < 0)
  2792.                findex = 15;
  2793.              if(findex > 15)
  2794.                findex = 0;
  2795.              str2 = ftlib + ((findex * SFTSIZ)+TFNOFS);
  2796.              strcpy(*str1,str2);
  2797.              v_bar(shandle,pxy);
  2798.              objc_draw(ad_pagenum,PFNAME,1,x,y,w,h);
  2799.              fntptr = ftlib + (findex*SFTSIZ);
  2800.              set_int(ad_pagenum,PFNUM,*fntptr);
  2801.              objc_draw(ad_pagenum,PFNUM,1,x,y,w,h);
  2802.              break;
  2803.  
  2804.     case PDISPNUM:curdflag^=TRUE; 
  2805.                       ad_pagenum[PDISPNUM].ob_state=((curdflag)?(CHECKED):(NORMAL));
  2806.               objc_draw(ad_pagenum,PDISPNUM,1,x,y,w,h);
  2807.               break;
  2808.     
  2809.     case PTOP:
  2810.     case PBOTTOM: curvpos = ((button == PTOP)?(0):(1));
  2811.               strcpy(*str4,dpagenum[curvpos]);
  2812.               objc_draw(ad_pagenum,PTDIST,1,x,y,w,h);
  2813.               break;
  2814.  
  2815.         
  2816.     default:
  2817.              break;
  2818.       }
  2819.     }while((button != PAGEOK) && (button != PAGECANC));
  2820.  
  2821.  
  2822.     ad_pagenum[button].ob_state = NORMAL;
  2823.     if(button == PAGEOK)
  2824.     {
  2825.     do_font_info(ad_pagenum,PFNUM,16,1,&pnum.pfnum); /* get font number */
  2826.  
  2827.  
  2828.     if(!parmcheck(ad_pagenum,PPOINTS,2,0))
  2829.                 pnum.pptsize = Pval;
  2830.       else
  2831.     {
  2832.       sobj = PPOINTS;
  2833.           objc_draw(ad_pagenum,button,1,x,y,w,h);
  2834.       goto err;
  2835.     }
  2836.  
  2837.     if(!parmcheck(ad_pagenum,PSETSIZE,2,0))
  2838.                 pnum.pstsize = Pval;
  2839.     else
  2840.     {
  2841.        sobj = PSETSIZE;
  2842.            objc_draw(ad_pagenum,button,1,x,y,w,h);
  2843.        goto err;
  2844.     }
  2845.  
  2846.     pnum.display = (ad_pagenum[PDISPNUM].ob_state == CHECKED);
  2847.  
  2848.         fpage = max(get_int(ad_pagenum,PNUMFROM),minpage);
  2849.         tpage = min(get_int(ad_pagenum,PNUMTO),maxpage);
  2850.         if(tpage < fpage)
  2851.         tpage = fpage;
  2852.     pnum.fpage = fpage;
  2853.         pnum.tpage = tpage;
  2854.  
  2855.     if(!parmcheck(ad_pagenum,PDIST,3,0))
  2856.             pnum.distance = Pval;
  2857.     else
  2858.     {
  2859.       sobj = PDIST;
  2860.           objc_draw(ad_pagenum,button,1,x,y,w,h);      
  2861.       goto err;
  2862.     }
  2863.  
  2864.     for(i=PLJLEFT;i<=PLJRIGHT;i++)
  2865.     {
  2866.        if(ad_pagenum[i].ob_state == SELECTED)
  2867.             pnum.ljust = i - PLJLEFT;
  2868.     }
  2869.  
  2870.  
  2871.     for(i=PRJLEFT;i<=PRJRIGHT;i++)
  2872.     {
  2873.        if(ad_pagenum[i].ob_state == SELECTED)
  2874.             pnum.rjust = i - PRJLEFT;
  2875.     }
  2876.  
  2877.     for(i=PLEFT;i<=PBOTH;i++)
  2878.     {
  2879.        if(ad_pagenum[i].ob_state == SELECTED)
  2880.             pnum.usage = i - PLEFT;
  2881.     }    
  2882.     
  2883.     for(i=PTOP;i<=PBOTTOM;i++)
  2884.     {
  2885.        if(ad_pagenum[i].ob_state == SELECTED)
  2886.                 pnum.vpos = i-PTOP;
  2887.     }
  2888.     strcpy(pnum.text,*str5);    
  2889.         pnum.tattrib.ptsz = pnum.pptsize;
  2890.         pnum.tattrib.font = pnum.pfnum;
  2891.     pnum.tattrib.ssiz = pnum.pstsize;
  2892.         pnum.tattrib.lnsp = (long)pttomu(pnum.pptsize/8);
  2893.     }
  2894.     form_dial(3,0,0,3,36,x,y,w,h);
  2895.     force_preview();
  2896.  
  2897. }
  2898.  
  2899.  
  2900.  
  2901. /**************************************************************************/
  2902. /* Function: do_dpi()                              */
  2903. /* Description: Set dpi for large monitors...                  */
  2904. /**************************************************************************/
  2905. do_dpi()
  2906. {
  2907.    int button;
  2908.    int xin,yin;
  2909.    long totalm;
  2910.    int dxres,dyres;
  2911.    long sbytes,pbytes;
  2912.  
  2913.    set_int(ad_dpi,HDPIDAT,axdpi[0]);
  2914.    set_int(ad_dpi,VDPIDAT,aydpi[0]);
  2915.  
  2916.    button = execform(ad_dpi,HDPIDAT);
  2917.    ad_dpi[button].ob_state = NORMAL;
  2918.    if(button == DOTOK)
  2919.    {
  2920.         xin = get_int(ad_dpi,HDPIDAT);
  2921.     yin = get_int(ad_dpi,VDPIDAT);
  2922.  
  2923.     totalm = Malloc(-1L);
  2924.         totalm += scan_bytes + prev_bytes;
  2925.  
  2926.     dxres = xin * 8;    /* max page sizes in inches */
  2927.         dyres = yin * 14;
  2928.         sbytes = ((((long)dxres) * (long)dyres)/ 8L);
  2929.     pbytes = sbytes * 4L;   /* for 200% size  */
  2930.  
  2931.         if((sbytes + pbytes) < totalm)
  2932.         {
  2933.         Mfree(scanesc);    /* free both buffers...*/
  2934.         Mfree(pagesc);
  2935.         scan_bytes = sbytes;
  2936.         pagebytes = prev_bytes = pbytes;
  2937.         scanptr = scanesc = (unsigned long)Malloc(scan_bytes);
  2938.         page_ptr = pagesc = (unsigned long)Malloc(prev_bytes);
  2939.  
  2940.         axdpi[0] = axdpi[1] = axdpi[2] = xin;
  2941.         aydpi[0] = aydpi[1] = aydpi[2] = yin;
  2942.  
  2943.          half_xdpi[0] = half_xdpi[1] = half_xdpi[2] = xin/2;
  2944.         half_ydpi[0] = half_ydpi[1] = half_ydpi[2] = yin/2;
  2945.  
  2946.         sdevm = 0;
  2947.         xdpi[0] = xin;
  2948.         ydpi[0] = yin;
  2949.  
  2950.             mutomem(hpage_size,vpage_size,&scan_xres,&scan_yres);        
  2951.             page_MFDB.fd_addr = page_ptr;         /* Preview address MFDB */
  2952.  
  2953.         mutopage(hpage_size,vpage_size,&mxres,&myres,1);
  2954.  
  2955.               page_area.g_x = page_area.g_y = 0L;
  2956.  
  2957.         gsx_moff();
  2958.               vsf_interior(shandle,0);            /* Set to Solid   */
  2959.  
  2960.               GDvq_extnd(mhandle,0,intout,mxres,myres,&page_ptr);        
  2961.  
  2962.  
  2963.               if( (view_size == PSIZE) ||
  2964.           (view_size == PADJCNT))
  2965.              pdraw_fit(view_size);
  2966.         else
  2967.                 pdraw_scale();
  2968.         zoom_setup();
  2969.               cur_scale = get_scale_num(view_size);
  2970.               get_work(prev_handle);
  2971.               update_preview_blit();
  2972.               set_clip(TRUE,&pwork);
  2973.               vr_recfl(shandle,pxy);
  2974.               clear_window(prev_handle,2,1);
  2975.               init_rulers();
  2976.  
  2977.               set_clip(TRUE,&dpwork);
  2978.               gsx_mon();
  2979.           world_setup();            /* Redo mu conversion table */
  2980.             IF_close();
  2981.         IF_open(0);
  2982.         recalc_alt_text();
  2983.  
  2984.         force_preview();
  2985.             slider_chk();
  2986.         }
  2987.     else
  2988.        alert_cntre(ALERT33);    /* not enough memory ...*/
  2989.    }
  2990.    /* cancel? axdpi[] and aydpi[] will stil be the same...    */
  2991. }
  2992.  
  2993.  
  2994.  
  2995.  
  2996. /**************************************************************************/
  2997. /* Function: set_parameters();                          */
  2998. /* Description: Save current parameters as default for startup.          */
  2999. /**************************************************************************/
  3000. save_parameters()
  3001. {
  3002.   register int i;
  3003.   int grid_unit;
  3004.   int length;
  3005.  
  3006.      if(alert_cntre(ALERT34)==1)             /* hit ok, so save...  */
  3007.      {
  3008.     pstorage[0]  =      view_size;           /* Preview Size      */
  3009.     pstorage[1]  =      ruler_flag;           /* Ruler Display      */
  3010.     pstorage[2]  =      unit_type;           /* Ruler Units      */
  3011.  
  3012.     for(i=GRBUT1;i<=GRBUT4;i++)
  3013.     {
  3014.        if(gridspace[i].ob_state == SELECTED)
  3015.                     grid_unit = i;
  3016.     }
  3017.     pstorage[3]  =     grid_unit;           /* Grid Spacing...     */ 
  3018.  
  3019.     pstorage[4]  =      show_grids;           /* Grid Display      */
  3020.     pstorage[5]  =      snap_to_grids;           /* Snap To Grid...     */
  3021.  
  3022.         pstorage[6]  =   get_int(ad_dpi,HDPIDAT);  /* xdpi for moniterm   */
  3023.     pstorage[7]  =   get_int(ad_dpi,VDPIDAT);  /* ydpi for moniterm   */
  3024.  
  3025.     pstorage[8]  =      gltxtattr.font;       /* Global Font      */
  3026.     pstorage[9]  =      gltxtattr.ptsz;       /* Global Point Size   */
  3027.     pstorage[10] =      gltxtattr.ssiz;       /* Global Set Size     */
  3028.     pstorage[11] =      (int)gltxtattr.lnsp;       /* Global Line Space   */
  3029.     pstorage[12] =      gltxtattr.kernmd;       /* Global Kerning...   */
  3030.     pstorage[13] =      gltxtattr.rvomd;       /* Reverse Video      */
  3031.     pstorage[14] =      gltxtattr.jstmd;       /* Justification      */
  3032.     pstorage[15] =      pagetype;           /* Paper Type      */
  3033.     pstorage[16] =      gltxtattr.scoff;       /* Scan Offset      */
  3034.     pstorage[17] =      gl_fstyle;           /* Fill Style      */
  3035.     pstorage[18] =      gl_findex;           /* Fill Index      */
  3036.     pstorage[19] =      gl_lstyle;           /* Line Style      */
  3037.     pstorage[20] =      gl_lwidth;           /* Line Width      */
  3038.     pstorage[21] =      gl_repel;           /* Repel Mode      */
  3039.     pstorage[22] =      gl_repbounds;           /* Repel Bounds      */
  3040.     pstorage[23] =      gl_repoffset;           /* Boundary Offset     */
  3041.     pstorage[24] =      pnum.pfnum;           /* Page Number Font    */
  3042.     pstorage[25] =      pnum.pptsize;           /* Page Num Pt Size    */
  3043.     pstorage[26] =      pnum.pstsize;           /* Page Num Set Size   */
  3044.     pstorage[27] =      pnum.display;           /* Page Num Display    */
  3045.     pstorage[28] =      pnum.ljust;           /* Page Num Left Just  */
  3046.     pstorage[29] =      pnum.rjust;           /* Page Num Right Just */
  3047.     pstorage[30] =      pnum.usage;           /* Page Num Usage      */
  3048.     pstorage[31] =      pnum.vpos;           /* Page Num Vert. Pos  */
  3049.     pstorage[32] =      (int)pnum.distance;       /* Page Num Distance   */
  3050.     pstorage[33] =      pnum.fpage;           /* Page Num From...    */
  3051.     pstorage[34] =      pnum.tpage;           /* Page Num To...      */
  3052.     pstorage[35] =      disp_type;           /* Template Usage...   */
  3053.     pstorage[36] =      disp_pos;           /* Template Location   */
  3054.     pstorage[37] =   gltxtattr.mcomp;       /* Manual Char. Comp.  */
  3055.     pstorage[38] =   gltxtattr.acomp;          /* Auto. Char Comp.    */
  3056.     pstorage[39] =   gltxtattr.hypmd;       /* Hyphenation Mode    */
  3057.     pstorage[40] =   gltxtattr.nsuchyp;       /* No. Of Succ. Hyphens*/
  3058.     pstorage[41] =   gltxtattr.nbefhyp;       /* No. of chars Before */
  3059.     pstorage[42] =   gltxtattr.nafthyp;       /* No. of chars After  */
  3060.     pstorage[43] =   gltxtattr.ltsmd;       /* Letterspacing mode  */
  3061.     pstorage[44] =   gltxtattr.plts;       /* Pos. Letter Spacing */
  3062.     pstorage[45] =   gltxtattr.nlts;       /* Neg. Letter Spacing */
  3063.     pstorage[46] =   gltxtattr.minsp;       /* Min. Space in RU      */
  3064.     pstorage[47] =   gltxtattr.prfsp;       /* Pref. Space In RU   */
  3065.     pstorage[48] =   gltxtattr.maxsp;       /* Max Space in RU     */
  3066.     pstorage[49] =   gltxtattr.psimd;       /* Pseudo Italic Mode  */
  3067.  
  3068.     length = strlen(pnum.text);
  3069.     pstorage[50] =      length;           /* Number of Chars     */
  3070.     strcpy(pnumtext,pnum.text);
  3071.  
  3072.     write_defaults();
  3073.      }
  3074. }
  3075.  
  3076.  
  3077.  
  3078.  
  3079. restore_defaults()
  3080. {
  3081.    register int i;
  3082.    int length;
  3083.    int grid_unit;
  3084.    register int *hval;
  3085.    register int *vval;
  3086.    register int **str;
  3087.  
  3088.    if(read_defaults())
  3089.    {
  3090.     view_size  = pstorage[0];           /* Preview Size      */
  3091.     ruler_flag = pstorage[1];           /* Ruler Display      */
  3092.     unit_type  = pstorage[2];           /* Ruler Units      */
  3093.  
  3094.     grid_unit    = pstorage[3];           /* Grid Spacing...     */ 
  3095.  
  3096.         switch(unit_type)
  3097.     {
  3098.         case 0:   str = grid_inch;
  3099.              hval = hinch_mus;
  3100.              vval = vinch_mus; 
  3101.               break;
  3102.            case 1:   str = grid_picas;
  3103.              hval = hpica_mus;
  3104.              vval = vpica_mus;
  3105.              break;
  3106.            case 2:   str = grid_cents;
  3107.              hval = hcent_mus;
  3108.              vval = vcent_mus;
  3109.              break;
  3110.            case 3:   str = grid_cicero;
  3111.              hval = hcicero_mus;
  3112.              vval = vcicero_mus;
  3113.              break;
  3114.     }
  3115.     for(i=GRBUT1;i<=GRBUT4;i++)
  3116.     {
  3117.        gridspace[i].ob_spec=str[i-GRBUT1];
  3118.        gridspace[i].ob_state=NORMAL;
  3119.     }
  3120.     gridspace[grid_unit].ob_state = SELECTED;
  3121.  
  3122.     hgridspace = hval[grid_unit - GRBUT1];
  3123.     vgridspace = vval[grid_unit - GRBUT1];
  3124.  
  3125.  
  3126.     show_grids    = pstorage[4];           /* Grid Display      */
  3127.     snap_to_grids = pstorage[5];           /* Snap To Grid...     */
  3128.  
  3129.         set_int(ad_dpi,HDPIDAT,pstorage[6]);       /* set dialog xdpi and */
  3130.         set_int(ad_dpi,VDPIDAT,pstorage[7]);       /* ydpi for moniterm   */
  3131.  
  3132.         init_tattr();                   /* Init Text Attributes*/
  3133.  
  3134.  
  3135.     pagetype         = pstorage[15];       /* Paper Type      */
  3136.     gl_fstyle        = pstorage[17];       /* Fill Style      */
  3137.  
  3138.     gl_findex      = pstorage[18];       /* Fill Index      */
  3139.     gl_lstyle      = pstorage[19];       /* Line Style      */
  3140.     gl_lwidth      = pstorage[20];       /* Line Width      */
  3141.  
  3142.     gl_repel     = pstorage[21];       /* Repel Mode      */
  3143.     gl_repbounds      = pstorage[22];       /* Repel Bounds      */
  3144.     gl_repoffset      = pstorage[23];       /* Boundary Offset     */
  3145.     pnum.pfnum      = pstorage[24];       /* Page Number Font    */
  3146.  
  3147.     pnum.pptsize     = pstorage[25];       /* Page Num Pt Size    */
  3148.     pnum.pstsize     = pstorage[26];       /* Page Num Set Size   */
  3149.     pnum.display     = pstorage[27];       /* Page Num Display    */
  3150.     pnum.ljust      = pstorage[28];       /* Page Num Left Just  */
  3151.     pnum.rjust       = pstorage[29];       /* Page Num Right Just */
  3152.  
  3153.     pnum.usage       = pstorage[30];       /* Page Num Usage      */
  3154.     pnum.vpos        = pstorage[31];       /* Page Num Vert. Pos  */
  3155.     pnum.distance    = (long)pstorage[32];       /* Page Num Distance   */
  3156.  
  3157.     pnum.fpage       = pstorage[33];       /* Page Num From...    */
  3158.     pnum.tpage       = pstorage[34];       /* Page Num To...      */
  3159.  
  3160.     disp_type        = pstorage[35];       /* Template Usage...   */
  3161.     disp_pos         = pstorage[36];       /* Template Location   */
  3162.  
  3163.     for(i=SETTBOTH;i<=SETTRITE;i++)
  3164.         ad_settmpl[i].ob_state = NORMAL;
  3165.     ad_settmpl[disp_type+SETTBOTH].ob_state = SELECTED;
  3166.  
  3167.     
  3168.         ad_settmpl[SETTFRNT].ob_state = NORMAL;
  3169.         ad_settmpl[SETTBACK].ob_state = NORMAL;
  3170.     
  3171.     if(disp_pos)
  3172.          ad_settmpl[SETTBACK].ob_state = SELECTED;
  3173.     else
  3174.          ad_settmpl[SETTFRNT].ob_state = SELECTED;
  3175.  
  3176.  
  3177.     length              = pstorage[50];       /* Number of Chars     */
  3178.     strcpy(pnum.text,pnumtext);
  3179.    }
  3180. }
  3181.  
  3182.  
  3183.  
  3184.  
  3185. set_text_defaults()
  3186. {
  3187.         pstorage[9]  = 24*8;
  3188.     pstorage[8]  = 1;
  3189.     pstorage[10] = 24*8;
  3190.     pstorage[11] = pttomu(26);
  3191.     pstorage[37] = 0;        /* Manual char. Compensation      */
  3192.     pstorage[38] = 0;        /* Auto. chr. Compensation        */
  3193.     pstorage[12] = 0;        /* Kerning              */
  3194.     pstorage[39] = 1;        /* Hyphenation              */
  3195.     pstorage[40] = 2;        /* No. of Successive Hyphens      */
  3196.     pstorage[41] = 2;        /* No. of chars Before Hyphen      */
  3197.     pstorage[42] = 3;        /* No. of chars After Hyphen      */
  3198.     pstorage[43] = 1;        /* Letterspacing Mode flag        */
  3199.     pstorage[44] = 3;        /* Positive Letter Space In RU    */
  3200.     pstorage[45] = 1;        /* Negative Letter Space In RU      */
  3201.     pstorage[46] = 12;        /* Minimum Space In RU          */
  3202.     pstorage[47] = 8;        /* Preferred Space in RU      */
  3203.     pstorage[48] = 30;        /* Maximum Space In RU          */
  3204.     pstorage[13] = 0;        /* Reverse Video Mode          */
  3205.     pstorage[49] = 0;        /* Pseudo Italic Mode Flag      */
  3206.     pstorage[14] = 0;        /* Justification Mode          */
  3207.     pstorage[16] = 0;        /* Scan Line Offset          */
  3208. }    
  3209.  
  3210.  
  3211.  
  3212.  
  3213. change_dpi()
  3214. {
  3215.    int xin,yin;
  3216.    long totalm;
  3217.    int dxres,dyres;
  3218.    long sbytes,pbytes;
  3219.  
  3220.     totalm = Malloc(-1L);
  3221.     totalm += scan_bytes + prev_bytes;
  3222.  
  3223.     xin = pstorage[6];
  3224.     yin = pstorage[7];
  3225.  
  3226.     dxres = xin * 8;   /* max page sizes in inches */
  3227.     dyres = yin * 14;
  3228.     sbytes = ((((long)dxres) * (long)dyres)/8L);
  3229.     pbytes = sbytes * 4L;                     /* for 200% size */
  3230.  
  3231.     if((sbytes + pbytes) < totalm)
  3232.     {
  3233.         Mfree(scanesc);    /* free both buffers...*/
  3234.         Mfree(pagesc);
  3235.         scan_bytes = sbytes;
  3236.         pagebytes = prev_bytes = pbytes;
  3237.         scanptr = scanesc = (unsigned long)Malloc(scan_bytes);
  3238.         page_ptr = pagesc = (unsigned long)Malloc(prev_bytes);
  3239.  
  3240.         axdpi[0] = axdpi[1] = axdpi[2] = xin;
  3241.         aydpi[0] = aydpi[1] = aydpi[2] = yin;
  3242.  
  3243.          half_xdpi[0] = half_xdpi[1] = half_xdpi[2] = xin/2;
  3244.         half_ydpi[0] = half_ydpi[1] = half_ydpi[2] = yin/2;
  3245.  
  3246.         xdpi[0] = xin;
  3247.         ydpi[0] = yin;
  3248.  
  3249. /*
  3250.         scan_xres = axdpi[0] * 8;
  3251.         scan_yres = aydpi[0] * 14;
  3252. */
  3253.         mutomem(hpage_size,vpage_size,&scan_xres,&scan_yres);
  3254.             page_MFDB.fd_addr = page_ptr;         /* Preview address MFDB */
  3255.  
  3256.         mutopage(hpage_size,vpage_size,&mxres,&myres,1);
  3257.  
  3258.               page_area.g_x = page_area.g_y = 0L;
  3259.  
  3260.         gsx_moff();
  3261.               vsf_interior(shandle,0);            /* Set to Solid   */
  3262.  
  3263.               GDvq_extnd(mhandle,0,intout,mxres,myres,&page_ptr);        
  3264.  
  3265.     }
  3266.     else
  3267.     alert_cntre(ALERT33);    /* not enough memory */
  3268.  
  3269. }
  3270.  
  3271.  
  3272. /* kludge for startup.c - adjustdpi() */
  3273. set_ad_dpi()
  3274. {
  3275.    set_int(ad_dpi,HDPIDAT,95);
  3276.    set_int(ad_dpi,VDPIDAT,95);
  3277. }
  3278.  
  3279.  
  3280.  
  3281.  
  3282.  
  3283. /**************************************************************************/
  3284. /*                                      */
  3285. /**************************************************************************/
  3286. do_about()
  3287. {
  3288.     int x,y,w,h;
  3289.     int sx,sy,sw,sh;
  3290.     int button;
  3291.  
  3292.     form_center(ad_deskset,&x,&y,&w,&h);
  3293.     form_center(ad_credits,&sx,&sy,&sw,&sh);
  3294.  
  3295.     form_dial(0,0,0,36,36,x,y,w,h);
  3296.     objc_draw(ad_deskset,0,MAX_DEPTH,x,y,w,h);
  3297.  
  3298.     do
  3299.     {
  3300.       button = form_do(ad_deskset,0);
  3301.       button &= 0x7fff;
  3302.  
  3303.       if(button == DTOUCH)
  3304.       {
  3305.         objc_draw(ad_credits,0,MAX_DEPTH,sx,sy,sw,sh);    
  3306.     button = form_do(ad_credits,0);
  3307.     button = OK;
  3308.       }
  3309.  
  3310.     }while(button != OK);
  3311.     form_dial(3,0,0,3,36,x,y,w,h);
  3312.  
  3313.     force_blit_redraw(0);    /* normal redraw with blits...*/
  3314.            
  3315. }
  3316.  
  3317.  
  3318.  
  3319. /**************************************************************************/
  3320. /* Function: do_info()                                */
  3321. /* Description: Handle information dialog box                  */
  3322. /**************************************************************************/
  3323. do_info()
  3324. {
  3325.     int x,y,w,h;
  3326.     int button;
  3327.     register int i;
  3328.     int dtxtflag;
  3329.     int dgflag;
  3330.     register OBJECT *slider;
  3331.     register OBJECT *sldbox;
  3332.     int    value;
  3333.     int x_box,y_box;
  3334.     int mov_dir;
  3335.     int mx,my;
  3336.     int dummy;
  3337.     int numpages;
  3338.     int pagenum;
  3339.     int tmppage;
  3340.     PAGE *xcurpage;
  3341.     PAGE *xpagehd;
  3342.     register REGION *rptr;
  3343.     int dwhat;
  3344.     int dtype;
  3345.  
  3346.     active_prim = FALSE;
  3347.     numpages = 0;
  3348.     tmppage = curr_page;
  3349.     xpagehd = pagehd;
  3350.     xcurpage = curpage;
  3351.     if(get_fpage(&pagenum))
  3352.     {
  3353.        numpages++;
  3354.        while(get_npage(&pagenum))       
  3355.                 numpages++;
  3356.     }
  3357.     curr_page = tmppage;
  3358.     pagehd = xpagehd;
  3359.     curpage = xcurpage;
  3360.     set_int(ad_info,DOCPAGE,numpages);
  3361.     tdinfo_ptr = gdinfo_ptr = ttdinfo_ptr = tgdinfo_ptr = cgdinfo_ptr = 0L;
  3362.  
  3363.     for(i=DI1;i<=DI10;i++)
  3364.        set_tedit(ad_info,i,tmpflname);
  3365.  
  3366.     if(region_ptr)        /* if a region is selected already     */
  3367.     {                    /* So show file only related to region */
  3368.        rptr = region_ptr;
  3369.        ctdinfo_ptr = 0L;        /* clipboard text, always null */
  3370.        cgdinfo_ptr = 0L;        /* clipboard graphics null     */
  3371.  
  3372.        if(tmplate_flag)            /* Is it a base page region?   */
  3373.        {                /* yes...template region       */
  3374.       dwhat = DITMPLTE;
  3375.       tdinfo_ptr = 0L;        /* document ptrs are null      */
  3376.           gdinfo_ptr = 0L;
  3377.       if(rptr->type)        /* graphic region?           */
  3378.       {                /* Yes...               */
  3379.         ttdinfo_ptr = 0L;     /* Zero out text ptr           */
  3380.         tgdinfo_ptr = get_grfname(rptr);
  3381.         dtype = DIGRAPH;
  3382.       }
  3383.       else                /* No..It's a text region      */
  3384.       {
  3385.         tgdinfo_ptr = 0L;     /* Zero out graphic ptr        */
  3386.         ttdinfo_ptr = 0L;
  3387.         
  3388.         if(rptr->artptr)
  3389.          {
  3390.           ttdinfo_ptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3391.           strcpy(ttdinfo_ptr->txtptr,rptr->artptr->filename);
  3392.               ttdinfo_ptr->next = 0L;
  3393.           ttdinfo_ptr->prev = 0L;
  3394.         }
  3395.             dtype = DITEXT;
  3396.       }
  3397.        }
  3398.        else                /* document region             */
  3399.        {
  3400.       dwhat = DIDOC;
  3401.       ttdinfo_ptr = 0L;        /* template ptrs are null      */
  3402.       tgdinfo_ptr = 0L;
  3403.       if(rptr->type)        /* graphic region ?           */
  3404.       {                /* Yes...               */
  3405.         tdinfo_ptr = 0L;    /* Zero out the text ptr       */
  3406.         gdinfo_ptr = get_grfname(rptr);
  3407.         dtype = DIGRAPH;
  3408.       }
  3409.       else                /* No...It's a text region     */
  3410.       {
  3411.         gdinfo_ptr = 0L;    /* Zero out the graphic ptr    */
  3412.         tdinfo_ptr = 0L;
  3413.         if(rptr->artptr)
  3414.         {
  3415.           tdinfo_ptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3416.           strcpy(tdinfo_ptr->txtptr,rptr->artptr->filename);
  3417.               tdinfo_ptr->next = 0L;
  3418.           tdinfo_ptr->prev = 0L;
  3419.         }
  3420.         dtype = DITEXT;
  3421.       }
  3422.        }
  3423.        region_ptr = gl_region_ptr = gl_grregion_ptr = 0L;
  3424.     }
  3425.     else                   /*show ALL text and graphic files*/
  3426.     {
  3427.        dtxtflag = set_dtext();        /* Document Text           */
  3428.        dgflag = set_dgraphics();    /* Document Graphics           */
  3429.        ctdinfo_ptr = 0L;        /* clipboard text, always null */
  3430.        set_dtmplate();            /* Template Graphics and Text  */
  3431.        set_dclipboard();        /* Clipboard Graphics           */
  3432.        dwhat = DIDOC;
  3433.        dtype = DITEXT;
  3434.     }
  3435.  
  3436.  
  3437.     for(i=DIDOC;i<=DICLIP;i++)
  3438.         ad_info[i].ob_state = NORMAL;
  3439.     ad_info[info_what + dwhat].ob_state = SELECTED;
  3440.  
  3441.     ad_info[DITEXT].ob_state = NORMAL;
  3442.     ad_info[DIGRAPH].ob_state = NORMAL;
  3443.     ad_info[info_type + dtype].ob_state = SELECTED;
  3444.  
  3445.  
  3446.     form_center(ad_info,&x,&y,&w,&h);
  3447.     form_dial(0,0,0,36,36,x,y,w,h);
  3448.     form_dial(1,0,0,36,36,x,y,w,h);
  3449.  
  3450.  
  3451.     maincount = dtcount = get_dinfo_items(tdinfo_ptr);
  3452.     dgcount = get_dinfo_items(gdinfo_ptr);
  3453.     ttcount = get_dinfo_items(ttdinfo_ptr);
  3454.     tgcount = get_dinfo_items(tgdinfo_ptr);
  3455.     cgcount = get_dinfo_items(cgdinfo_ptr);
  3456.     ctcount = 0;    
  3457.  
  3458.  
  3459.  
  3460.     objc_draw(ad_info,ROOT,MAX_DEPTH,x,y,w,h);
  3461.     type_info(dtype,dwhat);
  3462.     objc_draw(ad_info,DBOX,1,x,y,w,h);   
  3463.  
  3464.     slider = &ad_info[DISLIDE];
  3465.     sldbox = &ad_info[DIVERT];
  3466.     curfirst_art = 0;
  3467.  
  3468.     do
  3469.     {
  3470.        button = form_do(ad_info,0);
  3471.        button &= 0x7fff;
  3472.  
  3473.        switch(button)
  3474.        {
  3475.        case DIUP:    if(!slider->ob_y)
  3476.                      break;
  3477.             hndl_dlist(curfirst_art,-1);
  3478.             break;
  3479.  
  3480.        case DIDOWN:    if(slider->ob_y >= sldbox->ob_height - slider->ob_height)
  3481.                             break;    
  3482.             hndl_dlist(curfirst_art,1);
  3483.             break;
  3484.  
  3485.  
  3486.        case DISLIDE:value = graf_slidebox(ad_info,DIVERT,DISLIDE,1);
  3487.             value = scale_v(value,maincount-INFOMAX,1000);
  3488.             hndl_dlist(value,0);
  3489.             break;
  3490.  
  3491.        case DIVERT: graf_mkstate(&mx,&my,&dummy,&dummy);
  3492.             objc_offset(ad_info,DIVERT,&x_box,&y_box);
  3493.             if(my > y_box + slider->ob_y)
  3494.                     mov_dir = INFOMAX;
  3495.             else
  3496.                mov_dir = -INFOMAX;
  3497.             hndl_dlist(curfirst_art,mov_dir);
  3498.             break;
  3499.  
  3500.        case DIDOC:
  3501.        case DITMPLTE:
  3502.        case DICLIP:   type_info(info_type+DITEXT,button);
  3503.               info_what = button - DIDOC;
  3504.               objc_draw(ad_info,DBOX,1,x,y,w,h);   
  3505.               break;
  3506.  
  3507.  
  3508.        case DITEXT:
  3509.        case DIGRAPH:  type_info(button,info_what+DIDOC);
  3510.               info_type = button - DITEXT;
  3511.               objc_draw(ad_info,DBOX,1,x,y,w,h);   
  3512.               break;
  3513.        default:
  3514.            break;
  3515.        }
  3516.  
  3517.     }while(button != DIEXIT);
  3518.     form_dial(2,0,0,36,36,x,y,w,h);
  3519.     form_dial(3,0,0,3,36,x,y,w,h);
  3520.     info_what = info_type = 0;    /* set to first buttons */
  3521.     ad_info[button].ob_state = NORMAL;
  3522.  
  3523.     cleanup();
  3524.     force_blit_redraw(0);
  3525. }
  3526.  
  3527.  
  3528.  
  3529.  
  3530. /**************************************************************************/
  3531. /**************************************************************************/
  3532. set_dtext()
  3533. {
  3534.     register ARTICLE *darthd;
  3535.     register DINFO   *tptr;
  3536.     DINFO   *newptr;
  3537.  
  3538.     darthd = ((tmplate_flag)?(tarthd):(arthd));
  3539.  
  3540.     if(darthd)
  3541.     {
  3542.        tptr = tdinfo_ptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));        
  3543.        strcpy(tptr->txtptr,darthd->filename);
  3544.        tptr->next = 0L;
  3545.        tptr->prev = 0L;
  3546.  
  3547.        while(darthd->nextart)
  3548.        {
  3549.          darthd = darthd->nextart;
  3550.          newptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3551.          tptr->next = newptr;
  3552.          tptr->next->prev = tptr;
  3553.          tptr = tptr->next;
  3554.          tptr->next = 0L;
  3555.          strcpy(tptr->txtptr,darthd->filename);
  3556.        }
  3557.        return(1);    /* at least 1 or more text articles*/
  3558.     }
  3559.     return(0);    /* no text articles */
  3560. }
  3561.  
  3562.  
  3563.  
  3564.  
  3565. /**************************************************************************/
  3566. /**************************************************************************/
  3567. set_dgraphics()
  3568. {
  3569.     PAGE    *dpagehd;
  3570.     int     tmppage;
  3571.     PAGE    *tppage;
  3572.  
  3573.     dpagehd = ((tmplate_flag)?(tpagehd):(pagehd));
  3574.  
  3575.     tppage = pagehd;
  3576.     pagehd = dpagehd;
  3577.     tmppage = curr_page;
  3578.  
  3579.     gdinfo_ptr = set_info_graphics();
  3580.  
  3581.     curr_page = tmppage;
  3582.     region_ptr = gl_region_ptr = gl_grregion_ptr = 0L;
  3583.     curpage = pagehd = tppage;
  3584. }
  3585.  
  3586.  
  3587.  
  3588. /**************************************************************************/
  3589. /**************************************************************************/
  3590. cleanup()
  3591. {
  3592.     if(tdinfo_ptr)    /* DOCS TEXT MALLOC? */
  3593.     cleanse(tdinfo_ptr);
  3594.  
  3595.     if(gdinfo_ptr)    /* DOCS GRAPHIC MALLOC?*/
  3596.     cleanse(gdinfo_ptr);
  3597.  
  3598.     if(ttdinfo_ptr)    /* template TEXT malloc?*/
  3599.     cleanse(ttdinfo_ptr);
  3600.  
  3601.     if(tgdinfo_ptr)    /* template GRAPHIC malloc?*/
  3602.     cleanse(tgdinfo_ptr);    
  3603.  
  3604.     if(cgdinfo_ptr)    /* clipboard Graphic malloc*/
  3605.     cleanse(cgdinfo_ptr);
  3606.     tdinfo_ptr = gdinfo_ptr = ttdinfo_ptr = tgdinfo_ptr = cgdinfo_ptr = 0L;
  3607. }
  3608.  
  3609.  
  3610.  
  3611.  
  3612. /**************************************************************************/
  3613. /**************************************************************************/
  3614. cleanse(tptr)
  3615. register DINFO *tptr;
  3616. {
  3617.    register DINFO *pptr;
  3618.  
  3619.    while(tptr->next)
  3620.     tptr = tptr->next;
  3621.    pptr = tptr->prev;
  3622.    free(tptr);
  3623.    while(pptr)
  3624.    {
  3625.      tptr = pptr;
  3626.      pptr = tptr->prev;
  3627.      free(tptr);
  3628.    }
  3629. }
  3630.  
  3631.  
  3632.  
  3633. /**************************************************************************/
  3634. /**************************************************************************/
  3635. draw_text(tptr)
  3636. register DINFO *tptr;
  3637. {
  3638.   register int i;
  3639.  
  3640.   i = DI1;
  3641.   while((i<=DI10) && tptr)
  3642.   {
  3643.      set_tedit(ad_info,i,tptr->txtptr);
  3644.      tptr = tptr->next;
  3645.      i++;
  3646.   }
  3647. }
  3648.  
  3649.  
  3650.  
  3651. /**************************************************************************/
  3652. /**************************************************************************/
  3653. type_info(type,what)
  3654. int type;
  3655. int what;
  3656. {
  3657.    register DINFO *tptr;
  3658.    register int i;
  3659.    register int tot_names;
  3660.   
  3661.    for(i=DI1;i<=DI10;i++)
  3662.        set_tedit(ad_info,i,tmpflname);
  3663.    
  3664.    switch(what)
  3665.    {
  3666.      case DIDOC:     tptr=((type==DITEXT)?(tdinfo_ptr):(gdinfo_ptr));
  3667.             tot_names=((type==DITEXT)?(dtcount):(dgcount));
  3668.             break;
  3669.  
  3670.     case DITMPLTE:  tptr=((type==DITEXT)?(ttdinfo_ptr):(tgdinfo_ptr));
  3671.             tot_names=((type==DITEXT)?(ttcount):(tgcount));
  3672.             break;
  3673.  
  3674.     case DICLIP:    tptr=((type==DITEXT)?(ctdinfo_ptr):(cgdinfo_ptr));
  3675.             tot_names=((type==DITEXT)?(ctcount):(cgcount));
  3676.             break;
  3677.    }
  3678.    maincount = tot_names;
  3679.    curdinfo  = tptr;
  3680.    curfirst_art = 0;
  3681.    init_slider(ad_info,tot_names,DISLIDE,DIVERT,&hslider,INFOMAX);
  3682.    do_slider(ad_info,DISLIDE,DIVERT,hslider,tot_names,0,INFOMAX);
  3683.    objc_draw(ad_info,DIVERT,1,aworkx,aworky,aworkw,aworkh);     /* draw it */
  3684.    draw_text(tptr);
  3685. }
  3686.  
  3687.  
  3688.  
  3689.  
  3690. /**************************************************************************/
  3691. /* Function: Setup DINFO structure for tmplate                   */
  3692. /**************************************************************************/
  3693. set_dtmplate()
  3694. {
  3695.    register DINFO *tptr;
  3696.  
  3697.    DINFO *mptr;
  3698.    DINFO *newptr;
  3699.    DINFO *tempptr;
  3700.  
  3701.    PAGE *bpagehd;
  3702.    int  bcurr_page;
  3703.    PAGE *bcurpage;
  3704.  
  3705.    
  3706.    ttdinfo_ptr = 0L;
  3707.    tgdinfo_ptr = 0L;
  3708.    xarthd = 0L;
  3709.    xarthd = ltarthd;
  3710.  
  3711.    if(xarthd)                /* left template text */
  3712.    {
  3713.       tptr = ttdinfo_ptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3714.       strcpy(tptr->txtptr,xarthd->filename);
  3715.       tptr->next = 0L;
  3716.       tptr->prev = 0L;
  3717.       
  3718.       while(xarthd->nextart)
  3719.       {
  3720.     xarthd = xarthd->nextart;
  3721.     newptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3722.     tptr->next = newptr;
  3723.     tptr->next->prev = tptr;
  3724.     tptr = tptr->next;
  3725.     tptr->next = 0L;
  3726.     strcpy(tptr->txtptr,xarthd->filename);
  3727.       }
  3728.    }
  3729.  
  3730.    xarthd = 0L;
  3731.    xarthd = rtarthd;
  3732.    if(xarthd)                /* right template text */
  3733.    {                    
  3734.       newptr = mptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3735.       if(!ttdinfo_ptr)
  3736.       {
  3737.        tptr = ttdinfo_ptr = mptr;
  3738.            strcpy(tptr->txtptr,xarthd->filename);
  3739.            tptr->next = 0L;
  3740.            tptr->prev = 0L;
  3741.       }
  3742.       else
  3743.       {
  3744.     tptr->next = newptr;
  3745.     tptr->next->prev = tptr;
  3746.     tptr = tptr->next;
  3747.     tptr->next = 0L;
  3748.     strcpy(tptr->txtptr,xarthd->filename);
  3749.       }
  3750.  
  3751.       while(xarthd->nextart)
  3752.       {
  3753.     xarthd = xarthd->nextart;
  3754.     newptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  3755.     tptr->next = newptr;
  3756.     tptr->next->prev = tptr;
  3757.     tptr = tptr->next;
  3758.     tptr->next = 0L;
  3759.     strcpy(tptr->txtptr,xarthd->filename);
  3760.  
  3761.       }      
  3762.    }
  3763.  
  3764.    bpagehd = pagehd;
  3765.    bcurr_page = curr_page;
  3766.    bcurpage = curpage;
  3767.  
  3768.    pagehd = left_tmplate;
  3769.    tgdinfo_ptr = set_info_graphics();   
  3770.    
  3771.    
  3772.    pagehd = right_tmplate;
  3773.    tempptr = set_info_graphics();
  3774.  
  3775.    if(tgdinfo_ptr)
  3776.    {
  3777.       if(tempptr)
  3778.       {
  3779.         tptr = tgdinfo_ptr;
  3780.         while(tptr->next)
  3781.        tptr = tptr->next;
  3782.     tptr->next = tempptr;
  3783.       }
  3784.    }
  3785.    else
  3786.     tgdinfo_ptr = tempptr;
  3787.    
  3788.    curr_page = bcurr_page;
  3789.    pagehd = bpagehd;
  3790.    curpage = bcurpage;
  3791.    region_ptr = gl_region_ptr = gl_grregion_ptr = 0L;
  3792. }
  3793.  
  3794.  
  3795.  
  3796.  
  3797. /**************************************************************************/
  3798. /**************************************************************************/
  3799. DINFO *set_info_graphics()
  3800. {
  3801.     int     pagenum;
  3802.     register unsigned long    rptr;
  3803.     int     graf_flag;
  3804.     int     murect[4];    
  3805.     register int     op;        /* opcode */
  3806.     int     cnt;    /* count  */
  3807.     int     mode;    /* wmode  */
  3808.     int     flag;
  3809.     register DINFO   *tptr;
  3810.     DINFO   *newptr;
  3811.     DINFO   *xptr;
  3812.  
  3813.     flag = FALSE;
  3814.     xptr = 0L;
  3815.     if(get_fpage(&pagenum))
  3816.     {
  3817.      do
  3818.      {
  3819.     rptr = get_fregion(pagenum,&murect[0],&murect[1],
  3820.                &murect[2],&murect[3],&graf_flag);
  3821.         while(rptr)
  3822.     {
  3823.            if(graf_flag)
  3824.        {
  3825.          op = get_fprimitive(rptr,&cnt,&mode);
  3826.          while(op != -1)
  3827.          {
  3828.         if(op == 2)    /* only want filenames of graphics*/
  3829.         {
  3830.           if(!flag)    /* not even 1 malloc'ed yet */
  3831.           {
  3832.             tptr=xptr=(unsigned long)get_lmem((long)sizeof(struct dinfo));
  3833.             strcpy(tptr->txtptr,&ptsarray[5]);
  3834.             tptr->next = 0L;
  3835.             tptr->prev = 0L;
  3836.             flag = TRUE;
  3837.           }
  3838.           else        /* add to linked list       */
  3839.           {
  3840.                 newptr=(unsigned long)get_lmem((long)sizeof(struct dinfo));            
  3841.                  tptr->next = newptr;
  3842.                  tptr->next->prev = tptr;
  3843.                  tptr = tptr->next;
  3844.                  tptr->next = 0L;
  3845.             strcpy(tptr->txtptr,&ptsarray[5]);
  3846.           }  
  3847.  
  3848.         }
  3849.         op = get_nprimitive(&cnt,&mode);
  3850.          }
  3851.        }
  3852.        rptr = get_nregion(&murect[0],&murect[1],
  3853.                   &murect[2],&murect[3],&graf_flag);
  3854.     }
  3855.     
  3856.      }while(get_npage(&pagenum));
  3857.     }
  3858.     return(xptr);
  3859.  
  3860. }
  3861.  
  3862.  
  3863.  
  3864.  
  3865. /**************************************************************************/
  3866. /**************************************************************************/
  3867. set_dclipboard()
  3868. {
  3869.    PAGE *bpagehd;
  3870.    int  bcurr_page;
  3871.    PAGE *bcurpage;
  3872.  
  3873.    bpagehd = pagehd;
  3874.    bcurr_page = curr_page;
  3875.    bcurpage = curpage;
  3876.  
  3877.    pagehd = clippage;
  3878.    if(pagehd)
  3879.       cgdinfo_ptr = set_info_graphics();   
  3880.    
  3881.    curr_page = bcurr_page;
  3882.    pagehd = bpagehd;
  3883.    curpage = bcurpage;
  3884.    region_ptr = gl_region_ptr = gl_grregion_ptr = 0L;
  3885.  
  3886. }
  3887.  
  3888.  
  3889. get_dinfo_items(tptr)
  3890. register DINFO *tptr;
  3891. {
  3892.     register int i;
  3893.  
  3894.     i = 0;
  3895.     while(tptr)
  3896.     {
  3897.     i++;
  3898.     tptr = tptr->next;
  3899.     }
  3900.     return(i);
  3901. }
  3902.  
  3903.  
  3904.  
  3905.  
  3906.  
  3907.  
  3908. hndl_dlist(begname,movdir)
  3909. int begname;
  3910. int movdir;
  3911. {
  3912.    gsx_moff();
  3913.    curfirst_art = dscroll(maincount,begname,movdir);
  3914.    do_slider(ad_info,DISLIDE,DIVERT,hslider,maincount,curfirst_art,INFOMAX);
  3915.    gsx_mon();
  3916. }
  3917.  
  3918.  
  3919.  
  3920.  
  3921.  
  3922. dscroll(total_names,startname,amount)
  3923. int total_names;
  3924. int startname;
  3925. int amount;
  3926. {
  3927.   register int i,j;
  3928.   int textobj,x,y;
  3929.   long scrmfdb;
  3930.  
  3931.   scrmfdb = 0L;
  3932.  
  3933.   i = startname + amount;
  3934.   j = total_names - INFOMAX;
  3935.  
  3936.   if(i<0 || j<0)
  3937.     i = 0;
  3938.   if(j<0)
  3939.     j = 0;
  3940.   if(i>j)
  3941.     i = j;
  3942.  
  3943.   set_info_ptrs(i);
  3944.  
  3945.   if(amount != -1 && amount != 1)
  3946.   {                /* do page scrolling */
  3947.     objc_draw(ad_info,DBOX,1,aworkx,aworky,aworkw,aworkh);
  3948.     return(i);
  3949.   }
  3950.  
  3951.   if(i==startname)        /* reject unnecessary single scroll */
  3952.     return(i);        /* else we do a single line scroll  */
  3953.  
  3954.   objc_offset(ad_info,DI1,&x,&y);
  3955.  
  3956.    ptsin[0] = x;            /* init clipping x,y,w,h */
  3957.    ptsin[1] = y;
  3958.    ptsin[2] = x+ad_info[DI1].ob_width;
  3959.    ptsin[3] = y+gl_hchar*INFOMAX-1;
  3960.  
  3961.    ptsin[4] = x;            /* init blit destination */
  3962.    ptsin[5] = y;
  3963.    ptsin[6] = ptsin[2];
  3964.    ptsin[7] = ptsin[3];
  3965.  
  3966.    vs_clip(shandle,1,ptsin);
  3967.  
  3968.    if(amount < 0)
  3969.    {                /* - if going up -Up Arrow!!!*/
  3970.       ptsin[1] -= gl_hchar;    /* src y */
  3971.       ptsin[3] += gl_hchar;    /* src h*/
  3972.       ptsin[7] += gl_hchar;    
  3973.       textobj = ad_info[DBOX].ob_head;
  3974.       
  3975.    }
  3976.    else                /* going down -Down Arrow!! */
  3977.    {
  3978.       ptsin[3] += gl_hchar;
  3979.       ptsin[5] -= gl_hchar;
  3980.       ptsin[7] -= gl_hchar;
  3981.       textobj = ad_info[DBOX].ob_tail;
  3982.    }
  3983.  
  3984.    gsx_moff();
  3985.    vro_cpyfm(shandle,3,ptsin,&scrmfdb,&scrmfdb);
  3986.    objc_draw(ad_info,textobj,0,aworkx,aworky,aworkw,aworkh);
  3987.    gsx_mon();
  3988.    return(i);
  3989. }
  3990.  
  3991.  
  3992.  
  3993.  
  3994.  
  3995. set_info_ptrs(pos)
  3996. register int pos;
  3997. {
  3998.    register int i;
  3999.    register DINFO *tptr;
  4000.  
  4001.    for(i=DI1;i<=DI10;i++)
  4002.     set_tedit(ad_info,i,tmpflname);
  4003.  
  4004.    tptr = curdinfo;
  4005.  
  4006.    i = 0;        /* dangerous, eh?*/
  4007.    while((i!=pos) && tptr)
  4008.    {
  4009.     i++;
  4010.     tptr = tptr->next;
  4011.    }
  4012.  
  4013.    if(tptr)
  4014.       draw_text(tptr);
  4015. }
  4016.  
  4017.  
  4018.  
  4019.  
  4020.  
  4021.  
  4022. clr_attr_flag()
  4023. {
  4024.    register int i;
  4025.  
  4026.    for(i=0;i<=22;i++)
  4027.         attr_flag[i] = 0;
  4028. }
  4029.  
  4030.  
  4031.  
  4032.  
  4033. copy_attr(attr)
  4034. register struct txtattr *attr;
  4035. {
  4036.    register int i;
  4037.  
  4038.    for(i=0;i<= 22;i++)
  4039.    {
  4040.     if(attr_flag[i])
  4041.     {
  4042.         switch(i)
  4043.         {
  4044.         case 0: attr->llen   = gltxtattr.llen;
  4045.             break;
  4046.  
  4047.         case 1: attr->depth  = gltxtattr.depth;
  4048.             break;
  4049.  
  4050.         case 2: attr->lnsp   = gltxtattr.lnsp;
  4051.             break;
  4052.  
  4053.         case 3: attr->ptsz   = gltxtattr.ptsz;
  4054.             break;
  4055.  
  4056.         case 4: attr->ssiz   = gltxtattr.ssiz;
  4057.             break;
  4058.  
  4059.         case 5: attr->font   = gltxtattr.font;
  4060.             break;
  4061.  
  4062.         case 6: attr->mcomp  = gltxtattr.mcomp;
  4063.             break;
  4064.  
  4065.         case 7: attr->acomp  = gltxtattr.acomp;
  4066.             break;
  4067.  
  4068.         case 8: attr->kernmd = gltxtattr.kernmd;
  4069.             break;
  4070.  
  4071.         case 9: attr->hypmd  = gltxtattr.hypmd;
  4072.             break;
  4073.  
  4074.         case 10: attr->nsuchyp  = gltxtattr.nsuchyp;
  4075.             break;
  4076.  
  4077.         case 11: attr->nbefhyp  = gltxtattr.nbefhyp;
  4078.             break;
  4079.  
  4080.         case 12: attr->nafthyp  = gltxtattr.nafthyp;
  4081.             break;
  4082.  
  4083.         case 13: attr->ltsmd  = gltxtattr.ltsmd;
  4084.             break;
  4085.  
  4086.         case 14: attr->plts   = gltxtattr.plts;
  4087.             break;
  4088.  
  4089.         case 15: attr->nlts   = gltxtattr.nlts;
  4090.             break;
  4091.  
  4092.         case 16: attr->minsp  = gltxtattr.minsp;
  4093.             break;
  4094.  
  4095.         case 17: attr->prfsp  = gltxtattr.prfsp;
  4096.             break;
  4097.  
  4098.         case 18: attr->maxsp  = gltxtattr.maxsp;
  4099.             break;
  4100.  
  4101.         case 19: attr->rvomd  = gltxtattr.rvomd;
  4102.             break;
  4103.  
  4104.         case 20: attr->psimd  = gltxtattr.psimd;
  4105.             break;
  4106.  
  4107.         case 21: attr->jstmd  = gltxtattr.jstmd;
  4108.             break;
  4109.  
  4110.         case 22: attr->scoff  = gltxtattr.scoff;
  4111.             break;
  4112.         }
  4113.     }
  4114.    }
  4115. }
  4116.  
  4117.  
  4118.  
  4119. /*************************************************************/
  4120. /* Get filename of graphics for do_info...             */
  4121. /* specifically, only for when a region is selected...       */
  4122. /*************************************************************/
  4123. DINFO *get_grfname(rptr)
  4124. REGION *rptr;
  4125. {
  4126.     int cnt,mode;
  4127.     register int op;
  4128.     int flag;
  4129.     register DINFO *tptr;
  4130.     DINFO *xptr;
  4131.     DINFO *newptr;
  4132.  
  4133.     flag = FALSE;
  4134.     xptr = 0L;
  4135.     op = get_fprimitive(rptr,&cnt,&mode);
  4136.     while(op != -1)
  4137.     {
  4138.        if(op == 2)    /* Only want filenames of graphics*/
  4139.        {
  4140.           if(!flag)    /* not even 1 malloc'ed yet...    */
  4141.       {
  4142.           tptr = xptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  4143.               strcpy(tptr->txtptr,&ptsarray[5]);
  4144.           tptr->next = 0L;
  4145.               tptr->prev = 0L;
  4146.           flag = TRUE;
  4147.           }
  4148.           else
  4149.           {
  4150.           newptr = (unsigned long)get_lmem((long)sizeof(struct dinfo));
  4151.           tptr->next = newptr;
  4152.               tptr->next->prev = tptr;
  4153.               tptr = tptr->next;
  4154.               tptr->next = 0L;
  4155.               strcpy(tptr->txtptr,&ptsarray[5]);
  4156.           }
  4157.        }
  4158.        op = get_nprimitive(&cnt,&mode);
  4159.     }
  4160.     
  4161.     return(xptr);
  4162. }
  4163.